home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / smb.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2006-06-30  |  83KB  |  2,213 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import sys
  6. import socket
  7. import string
  8. import re
  9. import select
  10. import errno
  11. import nmb
  12. import types
  13. from random import randint
  14. from struct import *
  15. import ntlm
  16. from dcerpc import samr
  17. from structure import Structure
  18. unicode_support = 0
  19. unicode_convert = 1
  20.  
  21. try:
  22.     from cStringIO import StringIO
  23. except ImportError:
  24.     from StringIO import StringIO
  25.  
  26. from binascii import a2b_hex
  27. CVS_REVISION = '$Revision: 1.7 $'
  28. SHARED_DISK = 0
  29. SHARED_PRINT_QUEUE = 1
  30. SHARED_DEVICE = 2
  31. SHARED_IPC = 3
  32. ATTR_ARCHIVE = 32
  33. ATTR_COMPRESSED = 2048
  34. ATTR_NORMAL = 128
  35. ATTR_HIDDEN = 2
  36. ATTR_READONLY = 1
  37. ATTR_TEMPORARY = 256
  38. ATTR_DIRECTORY = 16
  39. ATTR_SYSTEM = 4
  40. SERVICE_DISK = 'A:'
  41. SERVICE_PRINTER = 'LPT1:'
  42. SERVICE_IPC = 'IPC'
  43. SERVICE_COMM = 'COMM'
  44. SERVICE_ANY = '?????'
  45. SV_TYPE_WORKSTATION = 1
  46. SV_TYPE_SERVER = 2
  47. SV_TYPE_SQLSERVER = 4
  48. SV_TYPE_DOMAIN_CTRL = 8
  49. SV_TYPE_DOMAIN_BAKCTRL = 16
  50. SV_TYPE_TIME_SOURCE = 32
  51. SV_TYPE_AFP = 64
  52. SV_TYPE_NOVELL = 128
  53. SV_TYPE_DOMAIN_MEMBER = 256
  54. SV_TYPE_PRINTQ_SERVER = 512
  55. SV_TYPE_DIALIN_SERVER = 1024
  56. SV_TYPE_XENIX_SERVER = 2048
  57. SV_TYPE_NT = 4096
  58. SV_TYPE_WFW = 8192
  59. SV_TYPE_SERVER_NT = 16384
  60. SV_TYPE_POTENTIAL_BROWSER = 65536
  61. SV_TYPE_BACKUP_BROWSER = 131072
  62. SV_TYPE_MASTER_BROWSER = 262144
  63. SV_TYPE_DOMAIN_MASTER = 524288
  64. SV_TYPE_LOCAL_LIST_ONLY = 1073741824
  65. SV_TYPE_DOMAIN_ENUM = 0x80000000L
  66. SMB_O_CREAT = 16
  67. SMB_O_EXCL = 0
  68. SMB_O_OPEN = 1
  69. SMB_O_TRUNC = 2
  70. SMB_SHARE_COMPAT = 0
  71. SMB_SHARE_DENY_EXCL = 16
  72. SMB_SHARE_DENY_WRITE = 32
  73. SMB_SHARE_DENY_READEXEC = 48
  74. SMB_SHARE_DENY_NONE = 64
  75. SMB_ACCESS_READ = 0
  76. SMB_ACCESS_WRITE = 1
  77. SMB_ACCESS_READWRITE = 2
  78. SMB_ACCESS_EXEC = 3
  79. TRANS_DISCONNECT_TID = 1
  80. TRANS_NO_RESPONSE = 2
  81.  
  82. def set_key_odd_parity(key):
  83.     ''''''
  84.     for i in range(len(key)):
  85.         for k in range(7):
  86.             bit = 0
  87.             t = key[i] >> k
  88.             bit = (t ^ bit) & 1
  89.         
  90.         key[i] = key[i] & 254 | bit
  91.     
  92.     return key
  93.  
  94.  
  95. def strerror(errclass, errcode):
  96.     if errclass == 1:
  97.         return ('OS error', ERRDOS.get(errcode, 'Unknown error'))
  98.     elif errclass == 2:
  99.         return ('Server error', ERRSRV.get(errcode, 'Unknown error'))
  100.     elif errclass == 3:
  101.         return ('Hardware error', ERRHRD.get(errcode, 'Unknown error'))
  102.     elif errclass == 128:
  103.         return ('Browse error', ERRBROWSE.get(errcode, 'Unknown error'))
  104.     elif errclass == 255:
  105.         return ('Bad command', 'Bad command. Please file bug report')
  106.     else:
  107.         return ('Unknown error', 'Unknown error')
  108.  
  109.  
  110. class SessionError(Exception):
  111.     ERRsuccess = 0
  112.     ERRbadfunc = 1
  113.     ERRbadfile = 2
  114.     ERRbadpath = 3
  115.     ERRnofids = 4
  116.     ERRnoaccess = 5
  117.     ERRbadfid = 6
  118.     ERRbadmcb = 7
  119.     ERRnomem = 8
  120.     ERRbadmem = 9
  121.     ERRbadenv = 10
  122.     ERRbadaccess = 12
  123.     ERRbaddata = 13
  124.     ERRres = 14
  125.     ERRbaddrive = 15
  126.     ERRremcd = 16
  127.     ERRdiffdevice = 17
  128.     ERRnofiles = 18
  129.     ERRgeneral = 31
  130.     ERRbadshare = 32
  131.     ERRlock = 33
  132.     ERRunsup = 50
  133.     ERRnetnamedel = 64
  134.     ERRnosuchshare = 67
  135.     ERRfilexists = 80
  136.     ERRinvalidparam = 87
  137.     ERRcannotopen = 110
  138.     ERRinsufficientbuffer = 122
  139.     ERRinvalidname = 123
  140.     ERRunknownlevel = 124
  141.     ERRnotlocked = 158
  142.     ERRrename = 183
  143.     ERRbadpipe = 230
  144.     ERRpipebusy = 231
  145.     ERRpipeclosing = 232
  146.     ERRnotconnected = 233
  147.     ERRmoredata = 234
  148.     ERRnomoreitems = 259
  149.     ERRbaddirectory = 267
  150.     ERReasnotsupported = 282
  151.     ERRlogonfailure = 1326
  152.     ERRbuftoosmall = 2123
  153.     ERRunknownipc = 2142
  154.     ERRnosuchprintjob = 2151
  155.     ERRinvgroup = 2455
  156.     ERRnoipc = 66
  157.     ERRdriveralreadyinstalled = 1795
  158.     ERRunknownprinterport = 1796
  159.     ERRunknownprinterdriver = 1797
  160.     ERRunknownprintprocessor = 1798
  161.     ERRinvalidseparatorfile = 1799
  162.     ERRinvalidjobpriority = 1800
  163.     ERRinvalidprintername = 1801
  164.     ERRprinteralreadyexists = 1802
  165.     ERRinvalidprintercommand = 1803
  166.     ERRinvaliddatatype = 1804
  167.     ERRinvalidenvironment = 1805
  168.     ERRunknownprintmonitor = 3000
  169.     ERRprinterdriverinuse = 3001
  170.     ERRspoolfilenotfound = 3002
  171.     ERRnostartdoc = 3003
  172.     ERRnoaddjob = 3004
  173.     ERRprintprocessoralreadyinstalled = 3005
  174.     ERRprintmonitoralreadyinstalled = 3006
  175.     ERRinvalidprintmonitor = 3007
  176.     ERRprintmonitorinuse = 3008
  177.     ERRprinterhasjobsqueued = 3009
  178.     ERRerror = 1
  179.     ERRbadpw = 2
  180.     ERRbadtype = 3
  181.     ERRaccess = 4
  182.     ERRinvnid = 5
  183.     ERRinvnetname = 6
  184.     ERRinvdevice = 7
  185.     ERRqfull = 49
  186.     ERRqtoobig = 50
  187.     ERRinvpfid = 52
  188.     ERRsmbcmd = 64
  189.     ERRsrverror = 65
  190.     ERRfilespecs = 67
  191.     ERRbadlink = 68
  192.     ERRbadpermits = 69
  193.     ERRbadpid = 70
  194.     ERRsetattrmode = 71
  195.     ERRpaused = 81
  196.     ERRmsgoff = 82
  197.     ERRnoroom = 83
  198.     ERRrmuns = 87
  199.     ERRtimeout = 88
  200.     ERRnoresource = 89
  201.     ERRtoomanyuids = 90
  202.     ERRbaduid = 91
  203.     ERRuseMPX = 250
  204.     ERRuseSTD = 251
  205.     ERRcontMPX = 252
  206.     ERRbadPW = None
  207.     ERRnosupport = 0
  208.     ERRunknownsmb = 22
  209.     ERRnowrite = 19
  210.     ERRbadunit = 20
  211.     ERRnotready = 21
  212.     ERRbadcmd = 22
  213.     ERRdata = 23
  214.     ERRbadreq = 24
  215.     ERRseek = 25
  216.     ERRbadmedia = 26
  217.     ERRbadsector = 27
  218.     ERRnopaper = 28
  219.     ERRwrite = 29
  220.     ERRread = 30
  221.     ERRgeneral = 31
  222.     ERRwrongdisk = 34
  223.     ERRFCBunavail = 35
  224.     ERRsharebufexc = 36
  225.     ERRdiskfull = 39
  226.     hard_msgs = {
  227.         19: ('ERRnowrite', 'Attempt to write on write-protected diskette.'),
  228.         20: ('ERRbadunit', 'Unknown unit.'),
  229.         21: ('ERRnotready', 'Drive not ready.'),
  230.         22: ('ERRbadcmd', 'Unknown command.'),
  231.         23: ('ERRdata', 'Data error (CRC).'),
  232.         24: ('ERRbadreq', 'Bad request structure length.'),
  233.         25: ('ERRseek', 'Seek error.'),
  234.         26: ('ERRbadmedia', 'Unknown media type.'),
  235.         27: ('ERRbadsector', 'Sector not found.'),
  236.         28: ('ERRnopaper', 'Printer out of paper.'),
  237.         29: ('ERRwrite', 'Write fault.'),
  238.         30: ('ERRread', 'Read fault.'),
  239.         31: ('ERRgeneral', 'General failure.'),
  240.         32: ('ERRbadshare', 'An open conflicts with an existing open.'),
  241.         33: ('ERRlock', 'A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process.'),
  242.         34: ('ERRwrongdisk', 'The wrong disk was found in a drive.'),
  243.         35: ('ERRFCBUnavail', 'No FCBs are available to process request.'),
  244.         36: ('ERRsharebufexc', 'A sharing buffer has been exceeded.') }
  245.     dos_msgs = {
  246.         ERRbadfunc: ('ERRbadfunc', 'Invalid function.'),
  247.         ERRbadfile: ('ERRbadfile', 'File not found.'),
  248.         ERRbadpath: ('ERRbadpath', 'Directory invalid.'),
  249.         ERRnofids: ('ERRnofids', 'No file descriptors available'),
  250.         ERRnoaccess: ('ERRnoaccess', 'Access denied.'),
  251.         ERRbadfid: ('ERRbadfid', 'Invalid file handle.'),
  252.         ERRbadmcb: ('ERRbadmcb', 'Memory control blocks destroyed.'),
  253.         ERRnomem: ('ERRnomem', 'Insufficient server memory to perform the requested function.'),
  254.         ERRbadmem: ('ERRbadmem', 'Invalid memory block address.'),
  255.         ERRbadenv: ('ERRbadenv', 'Invalid environment.'),
  256.         11: ('ERRbadformat', 'Invalid format.'),
  257.         ERRbadaccess: ('ERRbadaccess', 'Invalid open mode.'),
  258.         ERRbaddata: ('ERRbaddata', 'Invalid data.'),
  259.         ERRres: ('ERRres', 'reserved.'),
  260.         ERRbaddrive: ('ERRbaddrive', 'Invalid drive specified.'),
  261.         ERRremcd: ('ERRremcd', "A Delete Directory request attempted  to  remove  the  server's  current directory."),
  262.         ERRdiffdevice: ('ERRdiffdevice', 'Not same device.'),
  263.         ERRnofiles: ('ERRnofiles', 'A File Search command can find no more files matching the specified criteria.'),
  264.         ERRbadshare: ('ERRbadshare', 'The sharing mode specified for an Open conflicts with existing  FIDs  on the file.'),
  265.         ERRlock: ('ERRlock', 'A Lock request conflicted with an existing lock or specified an  invalid mode,  or an Unlock requested attempted to remove a lock held by another process.'),
  266.         ERRunsup: ('ERRunsup', 'The operation is unsupported'),
  267.         ERRnosuchshare: ('ERRnosuchshare', 'You specified an invalid share name'),
  268.         ERRfilexists: ('ERRfilexists', 'The file named in a Create Directory, Make  New  File  or  Link  request already exists.'),
  269.         ERRinvalidname: ('ERRinvalidname', 'Invalid name'),
  270.         ERRbadpipe: ('ERRbadpipe', 'Pipe invalid.'),
  271.         ERRpipebusy: ('ERRpipebusy', 'All instances of the requested pipe are busy.'),
  272.         ERRpipeclosing: ('ERRpipeclosing', 'Pipe close in progress.'),
  273.         ERRnotconnected: ('ERRnotconnected', 'No process on other end of pipe.'),
  274.         ERRmoredata: ('ERRmoredata', 'There is more data to be returned.'),
  275.         ERRinvgroup: ('ERRinvgroup', 'Invalid workgroup (try the -W option)'),
  276.         ERRlogonfailure: ('ERRlogonfailure', 'Logon failure'),
  277.         ERRdiskfull: ('ERRdiskfull', 'Disk full'),
  278.         ERRgeneral: ('ERRgeneral', 'General failure'),
  279.         ERRunknownlevel: ('ERRunknownlevel', 'Unknown info level') }
  280.     server_msgs = {
  281.         1: ('ERRerror', 'Non-specific error code.'),
  282.         2: ('ERRbadpw', 'Bad password - name/password pair in a Tree Connect or Session Setup are invalid.'),
  283.         3: ('ERRbadtype', 'reserved.'),
  284.         4: ('ERRaccess', 'The requester does not have  the  necessary  access  rights  within  the specified  context for the requested function. The context is defined by the TID or the UID.'),
  285.         5: ('ERRinvnid', 'The tree ID (TID) specified in a command was invalid.'),
  286.         6: ('ERRinvnetname', 'Invalid network name in tree connect.'),
  287.         7: ('ERRinvdevice', 'Invalid device - printer request made to non-printer connection or  non-printer request made to printer connection.'),
  288.         49: ('ERRqfull', 'Print queue full (files) -- returned by open print file.'),
  289.         50: ('ERRqtoobig', 'Print queue full -- no space.'),
  290.         51: ('ERRqeof', 'EOF on print queue dump.'),
  291.         52: ('ERRinvpfid', 'Invalid print file FID.'),
  292.         64: ('ERRsmbcmd', 'The server did not recognize the command received.'),
  293.         65: ('ERRsrverror', 'The server encountered an internal error, e.g., system file unavailable.'),
  294.         67: ('ERRfilespecs', 'The file handle (FID) and pathname parameters contained an invalid  combination of values.'),
  295.         68: ('ERRreserved', 'reserved.'),
  296.         69: ('ERRbadpermits', 'The access permissions specified for a file or directory are not a valid combination.  The server cannot set the requested attribute.'),
  297.         70: ('ERRreserved', 'reserved.'),
  298.         71: ('ERRsetattrmode', 'The attribute mode in the Set File Attribute request is invalid.'),
  299.         81: ('ERRpaused', 'Server is paused.'),
  300.         82: ('ERRmsgoff', 'Not receiving messages.'),
  301.         83: ('ERRnoroom', 'No room to buffer message.'),
  302.         87: ('ERRrmuns', 'Too many remote user names.'),
  303.         88: ('ERRtimeout', 'Operation timed out.'),
  304.         89: ('ERRnoresource', 'No resources currently available for request.'),
  305.         90: ('ERRtoomanyuids', 'Too many UIDs active on this session.'),
  306.         91: ('ERRbaduid', 'The UID is not known as a valid ID on this session.'),
  307.         250: ('ERRusempx', 'Temp unable to support Raw, use MPX mode.'),
  308.         251: ('ERRusestd', 'Temp unable to support Raw, use standard read/write.'),
  309.         252: ('ERRcontmpx', 'Continue in MPX mode.'),
  310.         253: ('ERRreserved', 'reserved.'),
  311.         254: ('ERRreserved', 'reserved.'),
  312.         65535: ('ERRnosupport', 'Function not supported.') }
  313.     ERRDOS = 1
  314.     error_classes = {
  315.         0: ('SUCCESS', { }),
  316.         ERRDOS: ('ERRDOS', dos_msgs),
  317.         2: ('ERRSRV', server_msgs),
  318.         3: ('ERRHRD', hard_msgs),
  319.         4: ('ERRXOS', { }),
  320.         225: ('ERRRMX1', { }),
  321.         226: ('ERRRMX2', { }),
  322.         227: ('ERRRMX3', { }),
  323.         255: ('ERRCMD', { }) }
  324.     
  325.     def __init__(self, str, error_class, error_code):
  326.         self.args = str
  327.         self.error_class = error_class
  328.         self.error_code = error_code
  329.  
  330.     
  331.     def get_error_class(self):
  332.         return self.error_class
  333.  
  334.     
  335.     def get_error_code(self):
  336.         return self.error_code
  337.  
  338.     
  339.     def __str__(self):
  340.         error_class = SessionError.error_classes.get(self.error_class, None)
  341.         if not error_class:
  342.             error_code_str = self.error_code
  343.             error_class_str = self.error_class
  344.         else:
  345.             error_class_str = error_class[0]
  346.             error_code = error_class[1].get(self.error_code, None)
  347.             if not error_code:
  348.                 error_code_str = self.error_code
  349.             else:
  350.                 error_code_str = '%s(%s)' % error_code
  351.         return 'SessionError: %s, class: %s, code: %s' % (self.args, error_class_str, error_code_str)
  352.  
  353.  
  354.  
  355. class UnsupportedFeature(Exception):
  356.     pass
  357.  
  358.  
  359. class SharedDevice:
  360.     
  361.     def __init__(self, name, type, comment):
  362.         self._SharedDevice__name = name
  363.         self._SharedDevice__type = type
  364.         self._SharedDevice__comment = comment
  365.  
  366.     
  367.     def get_name(self):
  368.         return self._SharedDevice__name
  369.  
  370.     
  371.     def get_type(self):
  372.         return self._SharedDevice__type
  373.  
  374.     
  375.     def get_comment(self):
  376.         return self._SharedDevice__comment
  377.  
  378.     
  379.     def __repr__(self):
  380.         return '<SharedDevice instance: name=' + self._SharedDevice__name + ', type=' + str(self._SharedDevice__type) + ', comment="' + self._SharedDevice__comment + '">'
  381.  
  382.  
  383.  
  384. class SharedFile:
  385.     
  386.     def __init__(self, ctime, atime, mtime, filesize, allocsize, attribs, shortname, longname):
  387.         self._SharedFile__ctime = ctime
  388.         self._SharedFile__atime = atime
  389.         self._SharedFile__mtime = mtime
  390.         self._SharedFile__filesize = filesize
  391.         self._SharedFile__allocsize = allocsize
  392.         self._SharedFile__attribs = attribs
  393.         
  394.         try:
  395.             self._SharedFile__shortname = shortname[:string.index(shortname, '\x00')]
  396.         except ValueError:
  397.             self._SharedFile__shortname = shortname
  398.  
  399.         
  400.         try:
  401.             self._SharedFile__longname = longname[:string.index(longname, '\x00')]
  402.         except ValueError:
  403.             self._SharedFile__longname = longname
  404.  
  405.  
  406.     
  407.     def get_ctime(self):
  408.         return self._SharedFile__ctime
  409.  
  410.     
  411.     def get_ctime_epoch(self):
  412.         return self._SharedFile__convert_smbtime(self._SharedFile__ctime)
  413.  
  414.     
  415.     def get_mtime(self):
  416.         return self._SharedFile__mtime
  417.  
  418.     
  419.     def get_mtime_epoch(self):
  420.         return self._SharedFile__convert_smbtime(self._SharedFile__mtime)
  421.  
  422.     
  423.     def get_atime(self):
  424.         return self._SharedFile__atime
  425.  
  426.     
  427.     def get_atime_epoch(self):
  428.         return self._SharedFile__convert_smbtime(self._SharedFile__atime)
  429.  
  430.     
  431.     def get_filesize(self):
  432.         return self._SharedFile__filesize
  433.  
  434.     
  435.     def get_allocsize(self):
  436.         return self._SharedFile__allocsize
  437.  
  438.     
  439.     def get_attributes(self):
  440.         return self._SharedFile__attribs
  441.  
  442.     
  443.     def is_archive(self):
  444.         return self._SharedFile__attribs & ATTR_ARCHIVE
  445.  
  446.     
  447.     def is_compressed(self):
  448.         return self._SharedFile__attribs & ATTR_COMPRESSED
  449.  
  450.     
  451.     def is_normal(self):
  452.         return self._SharedFile__attribs & ATTR_NORMAL
  453.  
  454.     
  455.     def is_hidden(self):
  456.         return self._SharedFile__attribs & ATTR_HIDDEN
  457.  
  458.     
  459.     def is_readonly(self):
  460.         return self._SharedFile__attribs & ATTR_READONLY
  461.  
  462.     
  463.     def is_temporary(self):
  464.         return self._SharedFile__attribs & ATTR_TEMPORARY
  465.  
  466.     
  467.     def is_directory(self):
  468.         return self._SharedFile__attribs & ATTR_DIRECTORY
  469.  
  470.     
  471.     def is_system(self):
  472.         return self._SharedFile__attribs & ATTR_SYSTEM
  473.  
  474.     
  475.     def get_shortname(self):
  476.         return self._SharedFile__shortname
  477.  
  478.     
  479.     def get_longname(self):
  480.         return self._SharedFile__longname
  481.  
  482.     
  483.     def __repr__(self):
  484.         return '<SharedFile instance: shortname="' + self._SharedFile__shortname + '", longname="' + self._SharedFile__longname + '", filesize=' + str(self._SharedFile__filesize) + '>'
  485.  
  486.     
  487.     def __convert_smbtime(self, t):
  488.         x = t >> 32
  489.         y = t & 0xFFFFFFFFL
  490.         geo_cal_offset = 11644473600.0
  491.         return (x * 4.0 * (1 << 30) + (y & 0xFFF00000L)) * 9.9999999999999995e-08 - geo_cal_offset
  492.  
  493.  
  494.  
  495. class SMBMachine:
  496.     
  497.     def __init__(self, nbname, type, comment):
  498.         self._SMBMachine__nbname = nbname
  499.         self._SMBMachine__type = type
  500.         self._SMBMachine__comment = comment
  501.  
  502.     
  503.     def __repr__(self):
  504.         return '<SMBMachine instance: nbname="' + self._SMBMachine__nbname + '", type=' + hex(self._SMBMachine__type) + ', comment="' + self._SMBMachine__comment + '">'
  505.  
  506.  
  507.  
  508. class SMBDomain:
  509.     
  510.     def __init__(self, nbgroup, type, master_browser):
  511.         self._SMBDomain__nbgroup = nbgroup
  512.         self._SMBDomain__type = type
  513.         self._SMBDomain__master_browser = master_browser
  514.  
  515.     
  516.     def __repr__(self):
  517.         return '<SMBDomain instance: nbgroup="' + self._SMBDomain__nbgroup + '", type=' + hex(self._SMBDomain__type) + ', master browser="' + self._SMBDomain__master_browser + '">'
  518.  
  519.  
  520.  
  521. class NewSMBPacket(Structure):
  522.     structure = (('Signature', '"\xffSMB'), ('Command', 'B=0'), ('ErrorClass', 'B=0'), ('_reserved', 'B=0'), ('ErrorCode', '<H=0'), ('Flags1', 'B=0'), ('Flags2', '<H=0'), ('Padding', '12s=""'), ('Tid', '<H=0xffff'), ('Pid', '<H=0'), ('Uid', '<H=0'), ('Mid', '<H=0'), ('Data', '*:'))
  523.     
  524.     def __init__(self, **kargs):
  525.         Structure.__init__(self, **kargs)
  526.         if not kargs.has_key('data'):
  527.             self['Data'] = []
  528.         
  529.  
  530.     
  531.     def addCommand(self, command):
  532.         if len(self['Data']) == 0:
  533.             self['Command'] = command.command
  534.         else:
  535.             self['Data'][-1]['Parameters']['AndXCommand'] = command.command
  536.             self['Data'][-1]['Parameters']['AndXOffset'] = len(self)
  537.         self['Data'].append(command)
  538.  
  539.     
  540.     def isMoreData(self):
  541.         if self['Command'] in [
  542.             SMB.SMB_COM_TRANSACTION,
  543.             SMB.SMB_COM_READ_ANDX,
  544.             SMB.SMB_COM_READ_RAW] and self['ErrorClass'] == 1:
  545.             pass
  546.         return self['ErrorCode'] == SessionError.ERRmoredata
  547.  
  548.     
  549.     def isValidAnswer(self, cmd):
  550.         if self['Command'] == cmd:
  551.             if self['ErrorClass'] == 0 and self['ErrorCode'] == 0:
  552.                 return 1
  553.             elif self.isMoreData():
  554.                 return 1
  555.             
  556.             raise SessionError, ('SMB Library Error', self['ErrorClass'], self['ErrorCode'])
  557.         else:
  558.             raise UnsupportedFeature, 'Unexpected answer from server: Got %d, Expected %d' % (self['Command'], cmd)
  559.  
  560.  
  561.  
  562. class SMBPacket:
  563.     
  564.     def __init__(self, data = ''):
  565.         self._command = 0
  566.         self._error_class = 0
  567.         self._error_code = 0
  568.         self._flags = 0
  569.         self._flags2 = 0
  570.         self._pad = '\x00' * 12
  571.         self._tid = 0
  572.         self._pid = 0
  573.         self._uid = 0
  574.         self._mid = 0
  575.         self._wordcount = 0
  576.         self._parameter_words = ''
  577.         self._bytecount = 0
  578.         self._buffer = ''
  579.         if data != '':
  580.             self._command = ord(data[4])
  581.             self._error_class = ord(data[5])
  582.             self._error_code = unpack('<H', data[7:9])[0]
  583.             self._flags = ord(data[9])
  584.             self._flags2 = unpack('<H', data[10:12])[0]
  585.             self._tid = unpack('<H', data[24:26])[0]
  586.             self._pid = unpack('<H', data[26:28])[0]
  587.             self._uid = unpack('<H', data[28:30])[0]
  588.             self._mid = unpack('<H', data[30:32])[0]
  589.             self._wordcount = ord(data[32])
  590.             self._parameter_words = data[33:33 + self._wordcount * 2]
  591.             self._bytecount = ord(data[33 + self._wordcount * 2])
  592.             self._buffer = data[35 + self._wordcount * 2:]
  593.         
  594.  
  595.     
  596.     def set_command(self, command):
  597.         self._command = command
  598.  
  599.     
  600.     def set_error_class(self, error_class):
  601.         self._error_class = error_class
  602.  
  603.     
  604.     def set_error_code(self, error_code):
  605.         self._error_code = error_code
  606.  
  607.     
  608.     def set_flags(self, flags):
  609.         self._flags = flags
  610.  
  611.     
  612.     def set_flags2(self, flags2):
  613.         self._flags2 = flags2
  614.  
  615.     
  616.     def set_pad(self, pad):
  617.         self._pad = pad
  618.  
  619.     
  620.     def set_tid(self, tid):
  621.         self._tid = tid
  622.  
  623.     
  624.     def set_pid(self, pid):
  625.         self._pid = pid
  626.  
  627.     
  628.     def set_uid(self, uid):
  629.         self._uid = uid
  630.  
  631.     
  632.     def set_mid(self, mid):
  633.         self._mid = mid
  634.  
  635.     
  636.     def set_parameter_words(self, param):
  637.         self._parameter_words = param
  638.         self._wordcount = len(param) / 2
  639.  
  640.     
  641.     def set_buffer(self, buffer):
  642.         if type(buffer) is types.UnicodeType:
  643.             raise Exception('SMBPacket: Invalid buffer. Received unicode')
  644.         
  645.         self._buffer = buffer
  646.         self._bytecount = len(buffer)
  647.  
  648.     
  649.     def get_command(self):
  650.         return self._command
  651.  
  652.     
  653.     def get_error_class(self):
  654.         return self._error_class
  655.  
  656.     
  657.     def get_error_code(self):
  658.         return self._error_code
  659.  
  660.     
  661.     def get_flags(self):
  662.         return self._flags
  663.  
  664.     
  665.     def get_flags2(self):
  666.         return self._flags2
  667.  
  668.     
  669.     def get_pad(self):
  670.         return self._pad
  671.  
  672.     
  673.     def get_tid(self):
  674.         return self._tid
  675.  
  676.     
  677.     def get_pid(self):
  678.         return self._pid
  679.  
  680.     
  681.     def get_uid(self):
  682.         return self._uid
  683.  
  684.     
  685.     def get_mid(self):
  686.         return self._mid
  687.  
  688.     
  689.     def get_parameter_words(self):
  690.         return self._parameter_words
  691.  
  692.     
  693.     def get_wordcount(self):
  694.         return self._wordcount
  695.  
  696.     
  697.     def get_bytecount(self):
  698.         return self._bytecount
  699.  
  700.     
  701.     def get_buffer(self):
  702.         return self._buffer
  703.  
  704.     
  705.     def rawData(self):
  706.         data = pack('<4sBBBHBH12sHHHHB', '\xffSMB', self._command, self._error_class, 0, self._error_code, self._flags, self._flags2, self._pad, self._tid, self._pid, self._uid, self._mid, self._wordcount) + self._parameter_words + pack('<H', self._bytecount) + self._buffer
  707.         return data
  708.  
  709.  
  710.  
  711. class TRANSHeader:
  712.     
  713.     def __init__(self, params = '', data = ''):
  714.         self._total_param_count = 0
  715.         self._total_data_count = 0
  716.         self._max_param_count = 0
  717.         self._max_data_count = 0
  718.         self._max_setup_count = 0
  719.         self._flags = 0
  720.         self._timeout = 0
  721.         self._param_count = 0
  722.         self._param_offset = 0
  723.         self._data_count = 0
  724.         self._data_offset = 0
  725.         self._setup_count = 0
  726.         self._setup = 0
  727.         self._name = ''
  728.         self._pad = ''
  729.         self._parameters = 0
  730.         self._data = 0
  731.         if data != '' and params != '':
  732.             (self._total_param_count, self._total_data_count, _, self._param_count, self._param_offset, self._param_displacement, self._data_count, self._data_offset, self._data_displacement, self._setup_count, _) = unpack('<HHHHHHHHHBB', params)
  733.             self._data = data[-(self._data_count):]
  734.         
  735.  
  736.     
  737.     def set_flags(self, flags):
  738.         self._flags = flags
  739.  
  740.     
  741.     def set_name(self, name):
  742.         self._name = name
  743.  
  744.     
  745.     def set_setup(self, setup):
  746.         self._setup = setup
  747.  
  748.     
  749.     def set_parameters(self, parameters):
  750.         self._parameters = parameters
  751.         self._total_param_count = len(parameters)
  752.  
  753.     
  754.     def set_data(self, data):
  755.         self._data = data
  756.         self._total_data_count = len(data)
  757.  
  758.     
  759.     def set_max_data_count(self, max):
  760.         self._max_data_count = max
  761.  
  762.     
  763.     def set_max_param_count(self, max):
  764.         self._max_param_count = max
  765.  
  766.     
  767.     def get_rawParameters(self):
  768.         self._param_offset = 32 + 3 + 28 + len(self._setup) + len(self._name)
  769.         self._data_offset = self._param_offset + len(self._parameters)
  770.         return pack('<HHHHBBHLHHHHHBB', self._total_param_count, self._total_data_count, self._max_param_count, self._max_data_count, self._max_setup_count, 0, self._flags, self._timeout, 0, self._total_param_count, self._param_offset, self._total_data_count, self._data_offset, len(self._setup) / 2, 0) + self._setup
  771.  
  772.     
  773.     def get_data(self):
  774.         return self._data
  775.  
  776.     
  777.     def rawData(self):
  778.         return self._name + self._parameters + self._data
  779.  
  780.  
  781.  
  782. class SMBCommand(Structure):
  783.     structure = (('WordCount', 'B=len(Parameters)/2'), ('_ParametersLength', '_-Parameters', 'WordCount*2'), ('Parameters', ':'), ('ByteCount', '<H-Data'), ('Data', ':'))
  784.     
  785.     def __init__(self, commandOrData = None, data = None, **kargs):
  786.         data = None if type(commandOrData) == type(0) else commandOrData
  787.         Structure.__init__(self, data = data, **kargs)
  788.         if data is None:
  789.             self['Parameters'] = ''
  790.             self['Data'] = ''
  791.         
  792.  
  793.  
  794.  
  795. class AsciiOrUnicodeStructure(Structure):
  796.     
  797.     def __init__(self, flags = 0, **kargs):
  798.         if flags & SMB.FLAGS2_UNICODE:
  799.             self.structure = self.UnicodeStructure
  800.         else:
  801.             self.structure = self.AsciiStructure
  802.         return Structure.__init__(self, **kargs)
  803.  
  804.  
  805.  
  806. class SMBCommand_Parameters(Structure):
  807.     pass
  808.  
  809.  
  810. class SMBAndXCommand_Parameters(Structure):
  811.     commonHdr = (('AndXCommand', 'B=0xff'), ('_reserved', 'B=0'), ('AndXOffset', '<H=0'))
  812.     structure = (('Data', ':=""'),)
  813.  
  814.  
  815. class SMBSessionSetupAndX_Parameters(SMBAndXCommand_Parameters):
  816.     structure = (('MaxBuffer', '<H'), ('MaxMpxCount', '<H'), ('VCNumber', '<H'), ('SessionKey', '<L'), ('AnsiPwdLength', '<H'), ('UnicodePwdLength', '<H'), ('_reserved', '<L=0'), ('Capabilities', '<L'))
  817.  
  818.  
  819. class SMBSessionSetupAndX_Data(AsciiOrUnicodeStructure):
  820.     AsciiStructure = (('AnsiPwdLength', '_-AnsiPwd'), ('UnicodePwdLength', '_-UnicodePwd'), ('AnsiPwd', ':=""'), ('UnicodePwd', ':=""'), ('Account', 'z=""'), ('PrimaryDomain', 'z=""'), ('NativeOS', 'z=""'), ('NativeLanMan', 'z=""'))
  821.     UnicodeStructure = (('AnsiPwdLength', '_-AnsiPwd'), ('UnicodePwdLength', '_-UnicodePwd'), ('AnsiPwd', ':=""'), ('UnicodePwd', ':=""'), ('Account', 'w=""'), ('PrimaryDomain', 'w=""'), ('NativeOS', 'w=""'), ('NativeLanMan', 'w=""'))
  822.  
  823.  
  824. class SMBSessionSetupAndXResponse_Parameters(SMBAndXCommand_Parameters):
  825.     structure = (('Action', '<H'),)
  826.  
  827.  
  828. class SMBSessionSetupAndXResponse_Data(AsciiOrUnicodeStructure):
  829.     AsciiStructure = (('NativeOS', 'z=""'), ('NativeLanMan', 'z=""'), ('PrimaryDomain', 'z=""'))
  830.     UnicodeStructure = (('NativeOS', 'w=""'), ('NativeLanMan', 'w=""'), ('PrimaryDomain', 'w=""'))
  831.  
  832.  
  833. class SMBTreeConnect_Parameters(SMBCommand_Parameters):
  834.     structure = ()
  835.  
  836.  
  837. class SMBTreeConnect_Data(SMBCommand_Parameters):
  838.     structure = (('PathFormat', '"\x04'), ('Path', 'z'), ('PasswordFormat', '"\x04'), ('Password', 'z'), ('ServiceFormat', '"\x04'), ('Service', 'z'))
  839.  
  840.  
  841. class SMBTreeConnectAndX_Parameters(SMBAndXCommand_Parameters):
  842.     structure = (('Flags', '<H=0'), ('PasswordLength', '<H'))
  843.  
  844.  
  845. class SMBTreeConnectAndX_Data(SMBCommand_Parameters):
  846.     structure = (('_PasswordLength', '_-Password'), ('Password', ':'), ('Path', 'z'), ('Service', 'z'))
  847.  
  848.  
  849. class SMBNtCreateAndX_Parameters(SMBAndXCommand_Parameters):
  850.     structure = (('_reserved', 'B=0'), ('FileNameLength', '<H'), ('CreateFlags', '<L'), ('RootFid', '<L=0'), ('AccessMask', '<L'), ('AllocationSizeLo', '<L=0'), ('AllocationSizeHi', '<L=0'), ('FileAttributes', '<L=0'), ('ShareAccess', '<L=3'), ('Disposition', '<L=1'), ('CreateOptions', '<L'), ('Impersonation', '<L=2'), ('SecurityFlags', 'B=3'))
  851.  
  852.  
  853. class SMBNtCreateAndXResponse_Parameters(SMBAndXCommand_Parameters):
  854.     structure = (('OplockLevel', 'B=0'), ('Fid', '<H'), ('CreateAction', '<L'), ('CraetionTimeLo', '<L=0'), ('CraetionTimeHi', '<L=0'), ('AccessTimeLo', '<L=0'), ('AccessTimeHi', '<L=0'), ('LastWriteTimeLo', '<L=0'), ('LastWriteTimeHi', '<L=0'), ('ChangeTimeLo', '<L=0'), ('ChangeTimeHi', '<L=0'), ('FileAttributes', '<L=0x80'), ('AllocationSizeLo', '<L=0'), ('AllocationSizeHi', '<L=0'), ('EndOfFileLo', '<L=0'), ('EndOfFileHi', '<L=0'), ('FileType', '<H=0'), ('IPCState', '<H=0'), ('IsDirectory', 'B'))
  855.  
  856.  
  857. class SMBNtCreateAndX_Data(Structure):
  858.     structure = (('FileName', 'z'),)
  859.  
  860.  
  861. class SMBOpenAndX_Parameters(SMBAndXCommand_Parameters):
  862.     structure = (('Flags', '<H=0'), ('DesiredAccess', '<H=0'), ('SearchAttributes', '<H=0'), ('FileAttributes', '<H=0'), ('CreationTime', '<L=0'), ('OpenMode', '<H=1'), ('AllocationSize', '<L=0'), ('Reserved', '8s=""'))
  863.  
  864.  
  865. class SMBOpenAndX_Data(SMBNtCreateAndX_Data):
  866.     pass
  867.  
  868.  
  869. class SMBOpenAndXResponse_Parameters(SMBAndXCommand_Parameters):
  870.     structure = (('Fid', '<H=0'), ('FileAttributes', '<H=0'), ('LastWriten', '<L=0'), ('FileSize', '<L=0'), ('GrantedAccess', '<H=0'), ('FileType', '<H=0'), ('IPCState', '<H=0'), ('Action', '<H=0'), ('ServerFid', '<L=0'), ('_reserved', '<H=0'))
  871.  
  872.  
  873. class SMBWrite_Parameters(SMBCommand_Parameters):
  874.     structure = (('Fid', '<H'), ('Count', '<H'), ('Offset', '<L'), ('Remaining', '<H'))
  875.  
  876.  
  877. class SMBWrite_Data(Structure):
  878.     structure = (('BufferFormat', '<B=1'), ('DataLength', '<H-Data'), ('Data', ':'))
  879.  
  880.  
  881. class SMBWriteAndX_Parameters(SMBAndXCommand_Parameters):
  882.     structure = (('Fid', '<H'), ('Offset', '<L'), ('_reserved', '<L=0xff'), ('WriteMode', '<H=8'), ('Remaining', '<H'), ('DataLength_Hi', '<H=0'), ('DataLength', '<H'), ('DataOffset', '<H=0'), ('HighOffset', '<L=0'))
  883.  
  884.  
  885. class SMBWriteRaw_Parameters(SMBCommand_Parameters):
  886.     structure = (('Fid', '<H'), ('Count', '<H'), ('_reserved', '<H=0'), ('Offset', '<L'), ('Timeout', '<L=0'), ('WriteMode', '<H=0'), ('_reserved2', '<L=0'), ('DataLength', '<H'), ('DataOffset', '<H=0'))
  887.  
  888.  
  889. class SMBRead_Parameters(SMBCommand_Parameters):
  890.     structure = (('Fid', '<H'), ('Count', '<H'), ('Offset', '<L'), ('Remaining', '<H=Count'))
  891.  
  892.  
  893. class SMBReadResponse_Parameters(Structure):
  894.     structure = (('Count', '<H=0'), ('_reserved', '"\x00\x00\x00\x00\x00\x00\x00\x00'))
  895.  
  896.  
  897. class SMBReadResponse_Data(Structure):
  898.     structure = (('BufferFormat', '<B'), ('DataLength', '<H-Data'), ('Data', ':'))
  899.  
  900.  
  901. class SMBReadRaw_Parameters(SMBCommand_Parameters):
  902.     structure = (('Fid', '<H'), ('Offset', '<L'), ('MaxCount', '<H'), ('MinCount', '<H=MaxCount'), ('Timeout', '<L=0'), ('_reserved', '<H=0'))
  903.  
  904.  
  905. class SMBReadAndX_Parameters(SMBAndXCommand_Parameters):
  906.     structure = (('Fid', '<H'), ('Offset', '<L'), ('MaxCount', '<H'), ('MinCount', '<H=MaxCount'), ('_reserved', '<L=0xffffffff'), ('Remaining', '<H=MaxCount'), ('HighOffset', '<L=0'))
  907.  
  908.  
  909. class SMBReadAndXResponse_Parameters(SMBAndXCommand_Parameters):
  910.     structure = (('Remaining', '<H=0'), ('DataMode', '<H=0'), ('_reserved', '<H=0'), ('DataCount', '<H'), ('DataOffset', '<H'), ('DataCount_Hi', '<L'), ('_reserved2', '"\x00\x00\x00\x00\x00\x00'))
  911.  
  912.  
  913. class SMBOpen_Parameters(SMBCommand_Parameters):
  914.     structure = (('DesiredAccess', '<H=0'), ('SearchAttributes', '<H=0'))
  915.  
  916.  
  917. class SMBOpen_Data(Structure):
  918.     structure = (('FileNameFormat', '"\x04'), ('FileName', 'z'))
  919.  
  920.  
  921. class SMBOpenResponse_Parameters(SMBCommand_Parameters):
  922.     structure = (('Fid', '<H=0'), ('FileAttributes', '<H=0'), ('LastWriten', '<L=0'), ('FileSize', '<L=0'), ('GrantedAccess', '<H=0'))
  923.  
  924.  
  925. class NTLMDialect(SMBPacket):
  926.     
  927.     def __init__(self, data = ''):
  928.         SMBPacket.__init__(self, data)
  929.         self._selected_dialect = 0
  930.         self._security_mode = 0
  931.         self._max_mpx = 0
  932.         self._max_vc = 0
  933.         self._max_buffer = 0
  934.         self._max_raw = 0
  935.         self._session_key = 0
  936.         self._lsw_capabilities = 0
  937.         self._msw_capabilities = 0
  938.         self._utc_high = 0
  939.         self._utc_low = 0
  940.         self._minutes_utc = 0
  941.         self._encryption_key_len = 0
  942.         self._encryption_key = ''
  943.         self._server_domain = ''
  944.         self._server_name = ''
  945.         if data:
  946.             (self._selected_dialect, self._security_mode, self._max_mpx, self._max_vc) = unpack('<HBHH', self.get_parameter_words()[:7])
  947.             (self._max_buffer, self._max_raw, self._session_key, self._lsw_capabilities, self._msw_capabilities) = unpack('<lllHH', self.get_parameter_words()[7:16 + 7])
  948.             (self._utc_low, self._utc_high, self._minutes_utc, self._encryption_key_len) = unpack('<LLhB', self.get_parameter_words()[23:34])
  949.             if self._encryption_key_len > 0 and len(self.get_buffer()) >= self._encryption_key_len:
  950.                 self._encryption_key = self.get_buffer()[:self._encryption_key_len]
  951.                 buf = self.get_buffer()
  952.                 self._server_name = '<Unknown>'
  953.                 self._server_domain = '<Unknown>'
  954.                 
  955.                 try:
  956.                     if self._lsw_capabilities & 3:
  957.                         offset = self._encryption_key_len
  958.                         if offset & 1:
  959.                             offset += 1
  960.                         
  961.                         end = offset
  962.                         while ord(buf[end]) or ord(buf[end + 1]):
  963.                             end += 2
  964.                         self._server_domain = unicode(buf[offset:end], 'utf_16_le')
  965.                         end += 2
  966.                         offset = end
  967.                         while ord(buf[end]) or ord(buf[end + 1]):
  968.                             end += 2
  969.                         self._server_name = unicode(buf[offset:end], 'utf_16_le')
  970.                     else:
  971.                         offset = self._encryption_key_len
  972.                         idx1 = string.find(buf, '\x00', offset)
  973.                         if idx1 != -1:
  974.                             self._server_domain = buf[offset:idx1]
  975.                             idx2 = string.find(buf, '\x00', idx1 + 1)
  976.                             if idx2 != -1:
  977.                                 self._server_name = buf[idx1 + 1:idx2]
  978.                             
  979.  
  980.             else:
  981.                 self._encryption_key = ''
  982.         
  983.  
  984.     
  985.     def get_selected_dialect(self):
  986.         return self._selected_dialect
  987.  
  988.     
  989.     def get_security_mode(self):
  990.         return self._security_mode
  991.  
  992.     
  993.     def get_max_mpx(self):
  994.         return self._max_mpx
  995.  
  996.     
  997.     def get_max_vc(self):
  998.         return self._max_vc
  999.  
  1000.     
  1001.     def get_max_buffer(self):
  1002.         return self._max_buffer
  1003.  
  1004.     
  1005.     def get_max_raw(self):
  1006.         return self._max_raw
  1007.  
  1008.     
  1009.     def get_session_key(self):
  1010.         return self._session_key
  1011.  
  1012.     
  1013.     def get_lsw_capabilities(self):
  1014.         return self._lsw_capabilities
  1015.  
  1016.     
  1017.     def get_msw_capabilities(self):
  1018.         return self._msw_capabilities
  1019.  
  1020.     
  1021.     def get_utc(self):
  1022.         return (self._utc_high, self._utc_low)
  1023.  
  1024.     
  1025.     def get_minutes_utc(self):
  1026.         return self._minutes_utc
  1027.  
  1028.     
  1029.     def get_encryption_key_len(self):
  1030.         return self._encryption_key_len
  1031.  
  1032.     
  1033.     def get_encryption_key(self):
  1034.         return self._encryption_key
  1035.  
  1036.     
  1037.     def get_server_domain(self):
  1038.         return self._server_domain
  1039.  
  1040.     
  1041.     def get_server_name(self):
  1042.         return self._server_name
  1043.  
  1044.     
  1045.     def is_auth_mode(self):
  1046.         return self._security_mode & SMB.SECURITY_AUTH_MASK
  1047.  
  1048.     
  1049.     def is_share_mode(self):
  1050.         return self._security_mode & SMB.SECURITY_SHARE_MASK
  1051.  
  1052.     
  1053.     def is_rawmode(self):
  1054.         return self._lsw_capabilities & SMB.CAP_RAW_MODE
  1055.  
  1056.  
  1057.  
  1058. class SMB:
  1059.     SMB_COM_CREATE_DIRECTORY = 0
  1060.     SMB_COM_DELETE_DIRECTORY = 1
  1061.     SMB_COM_OPEN = 2
  1062.     SMB_COM_CREATE = 3
  1063.     SMB_COM_CLOSE = 4
  1064.     SMB_COM_FLUSH = 5
  1065.     SMB_COM_DELETE = 6
  1066.     SMB_COM_RENAME = 7
  1067.     SMB_COM_QUERY_INFORMATION = 8
  1068.     SMB_COM_SET_INFORMATION = 9
  1069.     SMB_COM_READ = 10
  1070.     SMB_COM_WRITE = 11
  1071.     SMB_COM_LOCK_BYTE_RANGE = 12
  1072.     SMB_COM_UNLOCK_BYTE_RANGE = 13
  1073.     SMB_COM_CREATE_TEMPORARY = 14
  1074.     SMB_COM_CREATE_NEW = 15
  1075.     SMB_COM_CHECK_DIRECTORY = 16
  1076.     SMB_COM_PROCESS_EXIT = 17
  1077.     SMB_COM_SEEK = 18
  1078.     SMB_COM_LOCK_AND_READ = 19
  1079.     SMB_COM_WRITE_AND_UNLOCK = 20
  1080.     SMB_COM_READ_RAW = 26
  1081.     SMB_COM_READ_MPX = 27
  1082.     SMB_COM_READ_MPX_SECONDARY = 28
  1083.     SMB_COM_WRITE_RAW = 29
  1084.     SMB_COM_WRITE_MPX = 30
  1085.     SMB_COM_WRITE_MPX_SECONDARY = 31
  1086.     SMB_COM_WRITE_COMPLETE = 32
  1087.     SMB_COM_QUERY_SERVER = 33
  1088.     SMB_COM_SET_INFORMATION2 = 34
  1089.     SMB_COM_QUERY_INFORMATION2 = 35
  1090.     SMB_COM_LOCKING_ANDX = 36
  1091.     SMB_COM_TRANSACTION = 37
  1092.     SMB_COM_TRANSACTION_SECONDARY = 38
  1093.     SMB_COM_IOCTL = 39
  1094.     SMB_COM_IOCTL_SECONDARY = 40
  1095.     SMB_COM_COPY = 41
  1096.     SMB_COM_MOVE = 42
  1097.     SMB_COM_ECHO = 43
  1098.     SMB_COM_WRITE_AND_CLOSE = 44
  1099.     SMB_COM_OPEN_ANDX = 45
  1100.     SMB_COM_READ_ANDX = 46
  1101.     SMB_COM_WRITE_ANDX = 47
  1102.     SMB_COM_NEW_FILE_SIZE = 48
  1103.     SMB_COM_CLOSE_AND_TREE_DISC = 49
  1104.     SMB_COM_TRANSACTION2 = 50
  1105.     SMB_COM_TRANSACTION2_SECONDARY = 51
  1106.     SMB_COM_FIND_CLOSE2 = 52
  1107.     SMB_COM_FIND_NOTIFY_CLOSE = 53
  1108.     SMB_COM_TREE_CONNECT = 112
  1109.     SMB_COM_TREE_DISCONNECT = 113
  1110.     SMB_COM_NEGOTIATE = 114
  1111.     SMB_COM_SESSION_SETUP_ANDX = 115
  1112.     SMB_COM_LOGOFF_ANDX = 116
  1113.     SMB_COM_TREE_CONNECT_ANDX = 117
  1114.     SMB_COM_QUERY_INFORMATION_DISK = 128
  1115.     SMB_COM_SEARCH = 129
  1116.     SMB_COM_FIND = 130
  1117.     SMB_COM_FIND_UNIQUE = 131
  1118.     SMB_COM_FIND_CLOSE = 132
  1119.     SMB_COM_NT_TRANSACT = 160
  1120.     SMB_COM_NT_TRANSACT_SECONDARY = 161
  1121.     SMB_COM_NT_CREATE_ANDX = 162
  1122.     SMB_COM_NT_CANCEL = 164
  1123.     SMB_COM_NT_RENAME = 165
  1124.     SMB_COM_OPEN_PRINT_FILE = 192
  1125.     SMB_COM_WRITE_PRINT_FILE = 193
  1126.     SMB_COM_CLOSE_PRINT_FILE = 194
  1127.     SMB_COM_GET_PRINT_QUEUE = 195
  1128.     SMB_COM_READ_BULK = 216
  1129.     SMB_COM_WRITE_BULK = 217
  1130.     SMB_COM_WRITE_BULK_DATA = 218
  1131.     SECURITY_SHARE_MASK = 1
  1132.     SECURITY_SHARE_SHARE = 0
  1133.     SECURITY_SHARE_USER = 1
  1134.     SECURITY_AUTH_MASK = 2
  1135.     SECURITY_AUTH_ENCRYPTED = 2
  1136.     SECURITY_AUTH_PLAINTEXT = 0
  1137.     RAW_READ_MASK = 1
  1138.     RAW_WRITE_MASK = 2
  1139.     CAP_RAW_MODE = 1
  1140.     CAP_MPX_MODE = 2
  1141.     CAP_UNICODE = 4
  1142.     CAP_LARGE_FILES = 8
  1143.     CAP_EXTENDED_SECURITY = 0x80000000L
  1144.     FLAGS1_PATHCASELESS = 8
  1145.     FLAGS2_LONG_FILENAME = 1
  1146.     FLAGS2_USE_NT_ERRORS = 16384
  1147.     FLAGS2_UNICODE = 32768
  1148.     
  1149.     def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = nmb.NETBIOS_SESSION_PORT, timeout = None):
  1150.         self._SMB__uid = 0
  1151.         self._SMB__server_os = ''
  1152.         self._SMB__server_lanman = ''
  1153.         self._SMB__server_domain = ''
  1154.         self._SMB__remote_name = string.upper(remote_name)
  1155.         self._SMB__is_pathcaseless = 0
  1156.         self._SMB__ntlm_dialect = 0
  1157.         self._SMB__sess = None
  1158.         if timeout == None:
  1159.             self._SMB__timeout = 30
  1160.         else:
  1161.             self._SMB__timeout = timeout
  1162.         if not my_name:
  1163.             my_name = socket.gethostname()
  1164.             i = string.find(my_name, '.')
  1165.             if i > -1:
  1166.                 my_name = my_name[:i]
  1167.             
  1168.         
  1169.         
  1170.         try:
  1171.             self._SMB__sess = nmb.NetBIOSSession(my_name, remote_name, remote_host, host_type, sess_port, timeout)
  1172.         except socket.error:
  1173.             ex = None
  1174.             raise ex
  1175.  
  1176.         self._SMB__neg_session()
  1177.         if not self._SMB__ntlm_dialect.is_auth_mode() == SMB.SECURITY_AUTH_PLAINTEXT:
  1178.             if not self._SMB__ntlm_dialect.is_auth_mode() == SMB.SECURITY_AUTH_ENCRYPTED and self._SMB__ntlm_dialect.get_encryption_key() or self._SMB__ntlm_dialect.get_encryption_key_len() >= 8:
  1179.                 raise AssertionError
  1180.         if self._SMB__ntlm_dialect.is_share_mode() == SMB.SECURITY_SHARE_SHARE:
  1181.             self.login('', '')
  1182.         
  1183.  
  1184.     
  1185.     def set_timeout(self, timeout):
  1186.         self._SMB__timeout = timeout
  1187.  
  1188.     
  1189.     def __del__(self):
  1190.         if self._SMB__sess:
  1191.             self._SMB__sess.close()
  1192.         
  1193.  
  1194.     
  1195.     def __decode_smb(self, data):
  1196.         (_, cmd, err_class, _, err_code, flags1, flags2, _, tid, pid, uid, mid, wcount) = unpack('<4sBBBHBH12sHHHHB', data[:33])
  1197.         param_end = 33 + wcount * 2
  1198.         return (cmd, err_class, err_code, flags1, flags2, tid, uid, mid, data[33:param_end], data[param_end + 2:])
  1199.  
  1200.     
  1201.     def recvSMB(self):
  1202.         r = self._SMB__sess.recv_packet(self._SMB__timeout)
  1203.         return NewSMBPacket(data = r.get_trailer())
  1204.  
  1205.     
  1206.     def recv_packet(self):
  1207.         r = self._SMB__sess.recv_packet(self._SMB__timeout)
  1208.         return SMBPacket(r.get_trailer())
  1209.  
  1210.     
  1211.     def __decode_trans(self, params, data):
  1212.         (totparamcnt, totdatacnt, _, paramcnt, paramoffset, paramds, datacnt, dataoffset, datads, setupcnt) = unpack('<HHHHHHHHHB', params[:19])
  1213.         if paramcnt + paramds < totparamcnt or datacnt + datads < totdatacnt:
  1214.             has_more = 1
  1215.         else:
  1216.             has_more = 0
  1217.         paramoffset = paramoffset - 55 - setupcnt * 2
  1218.         dataoffset = dataoffset - 55 - setupcnt * 2
  1219.         return (has_more, params[20:20 + setupcnt * 2], data[paramoffset:paramoffset + paramcnt], data[dataoffset:dataoffset + datacnt])
  1220.  
  1221.     
  1222.     def sendSMB(self, smb):
  1223.         smb['Uid'] = self._SMB__uid
  1224.         smb['Pid'] = os.getpid()
  1225.         self._SMB__sess.send_packet(str(smb))
  1226.  
  1227.     
  1228.     def send_smb(self, s):
  1229.         s.set_uid(self._SMB__uid)
  1230.         s.set_pid(os.getpid())
  1231.         self._SMB__sess.send_packet(s.rawData())
  1232.  
  1233.     
  1234.     def __send_smb_packet(self, cmd, flags, flags2, tid, mid, params = '', data = ''):
  1235.         smb = NewSMBPacket()
  1236.         smb['Flags'] = flags
  1237.         smb['Flags2'] = flags2
  1238.         smb['Tid'] = tid
  1239.         smb['Mid'] = mid
  1240.         cmd = SMBCommand(cmd)
  1241.         smb.addCommand(cmd)
  1242.         cmd['Parameters'] = params
  1243.         cmd['Data'] = data
  1244.         self.sendSMB(smb)
  1245.  
  1246.     
  1247.     def isValidAnswer(self, s, cmd):
  1248.         while s.rawData():
  1249.             if s.get_command() == cmd:
  1250.                 if s.get_error_class() == 0 and s.get_error_code() == 0:
  1251.                     return 1
  1252.                 else:
  1253.                     raise SessionError, ('SMB Library Error', s.get_error_class(), s.get_error_code())
  1254.             else:
  1255.                 break
  1256.             s.get_command() == cmd
  1257.         return 0
  1258.  
  1259.     
  1260.     def __neg_session(self):
  1261.         s = SMBPacket()
  1262.         s.set_command(SMB.SMB_COM_NEGOTIATE)
  1263.         s.set_buffer('\x02NT LM 0.12\x00')
  1264.         self.send_smb(s)
  1265.         while None:
  1266.             s = self.recv_packet()
  1267.             if self.isValidAnswer(s, SMB.SMB_COM_NEGOTIATE):
  1268.                 self._SMB__ntlm_dialect = NTLMDialect(s.rawData())
  1269.                 if self._SMB__ntlm_dialect.get_selected_dialect() == 65535:
  1270.                     raise UnsupportedFeature, 'Remote server does not know NT LM 0.12'
  1271.                 
  1272.                 if self._SMB__ntlm_dialect.get_lsw_capabilities() & SMB.CAP_EXTENDED_SECURITY:
  1273.                     raise UnsupportedFeature, 'This version of pysmb does not support extended security validation. Please file a request for it.'
  1274.                 
  1275.                 self._SMB__is_pathcaseless = s.get_flags() & SMB.FLAGS1_PATHCASELESS
  1276.                 return 1
  1277.                 continue
  1278.             return 0
  1279.  
  1280.     
  1281.     def tree_connect(self, path, password = '', service = SERVICE_ANY):
  1282.         if password:
  1283.             if self._SMB__ntlm_dialect.get_encryption_key():
  1284.                 password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
  1285.             
  1286.         
  1287.         if not unicode_support:
  1288.             if unicode_convert:
  1289.                 path = str(path)
  1290.             else:
  1291.                 raise Except('SMB: Can\t conver path from unicode!')
  1292.         
  1293.         smb = NewSMBPacket()
  1294.         smb['Flags1'] = 8
  1295.         treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT)
  1296.         treeConnect['Parameters'] = SMBTreeConnect_Parameters()
  1297.         treeConnect['Data'] = SMBTreeConnect_Data()
  1298.         treeConnect['Data']['Path'] = path.upper()
  1299.         treeConnect['Data']['Password'] = password
  1300.         treeConnect['Data']['Service'] = service
  1301.         smb.addCommand(treeConnect)
  1302.         self.sendSMB(smb)
  1303.         while None:
  1304.             smb = self.recvSMB()
  1305.             if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT):
  1306.                 return smb['Tid']
  1307.             
  1308.             return smb['Tid']
  1309.  
  1310.     
  1311.     def tree_connect_andx(self, path, password = None, service = SERVICE_ANY):
  1312.         if password:
  1313.             if self._SMB__ntlm_dialect.get_encryption_key():
  1314.                 password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
  1315.             
  1316.         else:
  1317.             password = '\x00'
  1318.         if not unicode_support:
  1319.             if unicode_convert:
  1320.                 path = str(path)
  1321.             else:
  1322.                 raise Except('SMB: Can\t convert path from unicode!')
  1323.         
  1324.         smb = NewSMBPacket()
  1325.         smb['Flags1'] = 8
  1326.         treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT_ANDX)
  1327.         treeConnect['Parameters'] = SMBTreeConnectAndX_Parameters()
  1328.         treeConnect['Data'] = SMBTreeConnectAndX_Data()
  1329.         treeConnect['Parameters']['PasswordLength'] = len(password)
  1330.         treeConnect['Data']['Password'] = password
  1331.         treeConnect['Data']['Path'] = path.upper()
  1332.         treeConnect['Data']['Service'] = service
  1333.         smb.addCommand(treeConnect)
  1334.         self.sendSMB(smb)
  1335.         while None:
  1336.             smb = self.recvSMB()
  1337.             if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT_ANDX):
  1338.                 return smb['Tid']
  1339.             
  1340.             return smb['Tid']
  1341.  
  1342.     connect_tree = tree_connect_andx
  1343.     
  1344.     def get_server_name(self):
  1345.         return self._SMB__ntlm_dialect.get_server_name()
  1346.  
  1347.     
  1348.     def get_session_key(self):
  1349.         return self._SMB__ntlm_dialect.get_session_key()
  1350.  
  1351.     
  1352.     def get_server_time(self):
  1353.         (high, low) = self._SMB__ntlm_dialect.get_utc()
  1354.         min = self._SMB__ntlm_dialect.get_minutes_utc()
  1355.         return samr.display_time(high, low, min)
  1356.  
  1357.     
  1358.     def disconnect_tree(self, tid):
  1359.         smb = NewSMBPacket()
  1360.         smb['Tid'] = tid
  1361.         smb.addCommand(SMBCommand(SMB.SMB_COM_TREE_DISCONNECT))
  1362.         self.sendSMB(smb)
  1363.         smb = self.recvSMB()
  1364.  
  1365.     
  1366.     def open(self, tid, filename, open_mode, desired_access):
  1367.         smb = NewSMBPacket()
  1368.         smb['Flags'] = 8
  1369.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1370.         smb['Tid'] = tid
  1371.         openFile = SMBCommand(SMB.SMB_COM_OPEN)
  1372.         openFile['Parameters'] = SMBOpen_Parameters()
  1373.         openFile['Parameters']['DesiredAccess'] = desired_access
  1374.         openFile['Parameters']['OpenMode'] = open_mode
  1375.         openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
  1376.         openFile['Data'] = SMBOpen_Data()
  1377.         openFile['Data']['FileName'] = filename
  1378.         smb.addCommand(openFile)
  1379.         self.sendSMB(smb)
  1380.         smb = self.recvSMB()
  1381.         if smb.isValidAnswer(SMB.SMB_COM_OPEN):
  1382.             openFileResponse = SMBCommand(smb['Data'][0])
  1383.             openFileParameters = SMBOpenResponse_Parameters(openFileResponse['Parameters'])
  1384.             return (openFileParameters['Fid'], openFileParameters['FileAttributes'], openFileParameters['LastWriten'], openFileParameters['FileSize'], openFileParameters['GrantedAccess'])
  1385.         
  1386.  
  1387.     
  1388.     def open_andx(self, tid, filename, open_mode, desired_access):
  1389.         smb = NewSMBPacket()
  1390.         smb['Flags'] = 8
  1391.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1392.         smb['Tid'] = tid
  1393.         openFile = SMBCommand(SMB.SMB_COM_OPEN_ANDX)
  1394.         openFile['Parameters'] = SMBOpenAndX_Parameters()
  1395.         openFile['Parameters']['DesiredAccess'] = desired_access
  1396.         openFile['Parameters']['OpenMode'] = open_mode
  1397.         openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
  1398.         openFile['Data'] = SMBOpenAndX_Data()
  1399.         openFile['Data']['FileName'] = filename
  1400.         smb.addCommand(openFile)
  1401.         self.sendSMB(smb)
  1402.         smb = self.recvSMB()
  1403.         if smb.isValidAnswer(SMB.SMB_COM_OPEN_ANDX):
  1404.             openFileResponse = SMBCommand(smb['Data'][0])
  1405.             openFileParameters = SMBOpenAndXResponse_Parameters(openFileResponse['Parameters'])
  1406.             return (openFileParameters['Fid'], openFileParameters['FileAttributes'], openFileParameters['LastWriten'], openFileParameters['FileSize'], openFileParameters['GrantedAccess'], openFileParameters['FileType'], openFileParameters['IPCState'], openFileParameters['Action'], openFileParameters['ServerFid'])
  1407.         
  1408.  
  1409.     
  1410.     def close(self, tid, fid):
  1411.         s = SMBPacket()
  1412.         s.set_command(SMB.SMB_COM_CLOSE)
  1413.         s.set_tid(tid)
  1414.         s.set_parameter_words(pack('<HL', fid, 0))
  1415.         self.send_smb(s)
  1416.         s = self.recv_packet()
  1417.  
  1418.     
  1419.     def send_trans(self, tid, setup, name, param, data, noAnswer = 0):
  1420.         t = TRANSHeader()
  1421.         s = SMBPacket()
  1422.         s.set_tid(tid)
  1423.         s.set_command(SMB.SMB_COM_TRANSACTION)
  1424.         s.set_flags(self._SMB__is_pathcaseless)
  1425.         s.set_flags2(SMB.FLAGS2_LONG_FILENAME)
  1426.         t.set_setup(setup)
  1427.         t.set_name(name)
  1428.         t.set_parameters(param)
  1429.         t.set_data(data)
  1430.         t.set_max_param_count(1024)
  1431.         t.set_max_data_count(65504)
  1432.         if noAnswer:
  1433.             t.set_flags(TRANS_NO_RESPONSE)
  1434.         
  1435.         s.set_parameter_words(t.get_rawParameters())
  1436.         s.set_buffer(t.rawData())
  1437.         self.send_smb(s)
  1438.  
  1439.     
  1440.     def __trans(self, tid, setup, name, param, data):
  1441.         data_len = len(data)
  1442.         name_len = len(name)
  1443.         param_len = len(param)
  1444.         setup_len = len(setup)
  1445.         if not setup_len & 1 == 0:
  1446.             raise AssertionError
  1447.         param_offset = name_len + setup_len + 63
  1448.         data_offset = param_offset + param_len
  1449.         self._SMB__send_smb_packet(SMB.SMB_COM_TRANSACTION, self._SMB__is_pathcaseless, SMB.FLAGS2_LONG_FILENAME, tid, 0, pack('<HHHHBBHLHHHHHBB', param_len, data_len, 1024, 65504, 0, 0, 0, 0, 0, param_len, param_offset, data_len, data_offset, setup_len / 2, 0) + setup, name + param + data)
  1450.  
  1451.     
  1452.     def trans2(self, tid, setup, name, param, data):
  1453.         data_len = len(data)
  1454.         name_len = len(name)
  1455.         param_len = len(param)
  1456.         setup_len = len(setup)
  1457.         if not setup_len & 1 == 0:
  1458.             raise AssertionError
  1459.         param_offset = name_len + setup_len + 63
  1460.         data_offset = param_offset + param_len
  1461.         self._SMB__send_smb_packet(SMB.SMB_COM_TRANSACTION2, self._SMB__is_pathcaseless, SMB.FLAGS2_LONG_FILENAME, tid, 0, pack('<HHHHBBHLHHHHHBB', param_len, data_len, 1024, self._SMB__ntlm_dialect.get_max_buffer(), 0, 0, 0, 0, 0, param_len, param_offset, data_len, data_offset, setup_len / 2, 0) + setup, name + param + data)
  1462.  
  1463.     
  1464.     def query_file_info(self, tid, fid):
  1465.         self.trans2(tid, '\x07\x00', '\x00', pack('<HH', fid, 263), '')
  1466.         while None:
  1467.             s = self.recv_packet()
  1468.             if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION2):
  1469.                 (f1, f2) = unpack('<LL', s.get_buffer()[53:53 + 8])
  1470.                 return (f2 & 0xFFFFFFFFL) << 32 | f1
  1471.                 continue
  1472.  
  1473.     
  1474.     def __nonraw_retr_file(self, tid, fid, offset, datasize, callback):
  1475.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1476.         read_offset = offset
  1477.         while read_offset < datasize:
  1478.             data = self.read_andx(tid, fid, read_offset, max_buf_size)
  1479.             callback(data)
  1480.             read_offset += len(data)
  1481.  
  1482.     
  1483.     def __raw_retr_file(self, tid, fid, offset, datasize, callback):
  1484.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1485.         read_offset = offset
  1486.         while read_offset < datasize:
  1487.             data = self.read_raw(tid, fid, read_offset, 65535)
  1488.             if not data:
  1489.                 data = self.read_andx(tid, fid, read_offset, max_buf_size)
  1490.             
  1491.             callback(data)
  1492.             read_offset += len(data)
  1493.  
  1494.     
  1495.     def __nonraw_stor_file(self, tid, fid, offset, datasize, callback):
  1496.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1497.         write_offset = offset
  1498.         while None:
  1499.             data = callback(max_buf_size)
  1500.             if not data:
  1501.                 break
  1502.             
  1503.             while None:
  1504.                 s = self.recv_packet()
  1505.                 if self.isValidAnswer(s, SMB.SMB_COM_WRITE_ANDX):
  1506.                     offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  1507.                     write_offset = write_offset + unpack('<H', s.get_parameter_words()[4:6])[0]
  1508.                     break
  1509.                     continue
  1510.  
  1511.     
  1512.     def __raw_stor_file(self, tid, fid, offset, datasize, callback):
  1513.         write_offset = offset
  1514.         while None:
  1515.             read_data = callback(65535)
  1516.             if not read_data:
  1517.                 break
  1518.             
  1519.             read_len = len(read_data)
  1520.             while None:
  1521.                 s = self.recv_packet()
  1522.                 if self.isValidAnswer(s, SMB.SMB_COM_WRITE_RAW):
  1523.                     self._SMB__sess.send_packet(read_data)
  1524.                     write_offset = write_offset + read_len
  1525.                     break
  1526.                     continue
  1527.         self._SMB__send_smb_packet(SMB.SMB_COM_CLOSE, 0, 0, tid, 0, pack('<HL', fid, 0), '')
  1528.         while None:
  1529.             s = self.recv_packet()
  1530.             if self.isValidAnswer(s, SMB.SMB_COM_CLOSE):
  1531.                 if s.get_error_class() == 0 and s.get_error_code() == 0:
  1532.                     return None
  1533.                 
  1534.  
  1535.     
  1536.     def __browse_servers(self, server_flags, container_type, domain):
  1537.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\IPC$')
  1538.         buf = StringIO()
  1539.         
  1540.         try:
  1541.             if server_flags & 0x80000000L:
  1542.                 self._SMB__trans(tid, '', '\\PIPE\\LANMAN\x00', 'h\x00WrLehDz\x00' + 'B16BBDz\x00\x01\x00\xff\xff\x00\x00\x00\x80', '')
  1543.             else:
  1544.                 self._SMB__trans(tid, '', '\\PIPE\\LANMAN\x00', 'h\x00WrLehDz\x00' + 'B16BBDz\x00\x01\x00\xff\xff' + pack('<l', server_flags) + domain + '\x00', '')
  1545.             servers = []
  1546.             entry_count = 0
  1547.             while None:
  1548.                 s = self.recv_packet()
  1549.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1550.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1551.                     if not entry_count:
  1552.                         (status, convert, entry_count, avail_entry) = unpack('<HHHH', transparam[:8])
  1553.                         if status and status != 234:
  1554.                             raise SessionError, ('Browse domains failed. (ErrClass: %d and ErrCode: %d)' % (128, status), 128, status)
  1555.                         
  1556.                     
  1557.                     buf.write(transdata)
  1558.                     if not has_more:
  1559.                         server_data = buf.getvalue()
  1560.                         for i in range(0, entry_count):
  1561.                             (server, _, server_type, comment_offset) = unpack('<16s2sll', server_data[i * 26:i * 26 + 26])
  1562.                             idx = string.find(server, '\x00')
  1563.                             idx2 = string.find(server_data, '\x00', comment_offset)
  1564.                             if idx < 0:
  1565.                                 server = server[:idx]
  1566.                             
  1567.                             servers.append(container_type(server, server_type, server_data[comment_offset:idx2]))
  1568.                         
  1569.                         return servers
  1570.                     
  1571.         finally:
  1572.             buf.close()
  1573.             self.disconnect_tree(tid)
  1574.  
  1575.  
  1576.     
  1577.     def get_server_domain(self):
  1578.         return self._SMB__server_domain
  1579.  
  1580.     
  1581.     def get_server_os(self):
  1582.         return self._SMB__server_os
  1583.  
  1584.     
  1585.     def get_server_lanman(self):
  1586.         return self._SMB__server_lanman
  1587.  
  1588.     
  1589.     def is_login_required(self):
  1590.         return self._SMB__ntlm_dialect.is_share_mode() == SMB.SECURITY_SHARE_USER
  1591.  
  1592.     
  1593.     def get_ntlmv1_response(self, key):
  1594.         challenge = self._SMB__ntlm_dialect.get_encryption_key()
  1595.         return ntlm.get_ntlmv1_response(key, challenge)
  1596.  
  1597.     
  1598.     def hmac_md5(self, key, data):
  1599.         import POW as POW
  1600.         h = POW.Hmac(POW.MD5_DIGEST, key)
  1601.         h.update(data)
  1602.         result = h.mac()
  1603.         return result
  1604.  
  1605.     
  1606.     def get_ntlmv2_response(self, hash):
  1607.         '''
  1608.         blob = RandomBytes( blobsize );
  1609.         data = concat( ServerChallenge, 8, blob, blobsize );
  1610.         hmac = hmac_md5( v2hash, 16, data, (8 + blobsize) );
  1611.         v2resp = concat( hmac, 16, blob, blobsize );
  1612.         '''
  1613.         return ''
  1614.  
  1615.     
  1616.     def login(self, user, password, domain = '', lmhash = '', nthash = ''):
  1617.         if (password != '' or password == '') and lmhash == '' and nthash == '':
  1618.             self.login_plaintext_password(user, password)
  1619.         elif lmhash != '' or nthash != '':
  1620.             self.login_pass_the_hash(user, lmhash, nthash, domain)
  1621.         
  1622.  
  1623.     
  1624.     def _login(self, user, pwd_ansi, pwd_unicode, domain = ''):
  1625.         smb = NewSMBPacket()
  1626.         smb['Flags1'] = 8
  1627.         sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
  1628.         sessionSetup['Parameters'] = SMBSessionSetupAndX_Parameters()
  1629.         sessionSetup['Data'] = SMBSessionSetupAndX_Data()
  1630.         sessionSetup['Parameters']['MaxBuffer'] = 65535
  1631.         sessionSetup['Parameters']['MaxMpxCount'] = 2
  1632.         sessionSetup['Parameters']['VCNumber'] = os.getpid()
  1633.         sessionSetup['Parameters']['SessionKey'] = self._SMB__ntlm_dialect.get_session_key()
  1634.         sessionSetup['Parameters']['AnsiPwdLength'] = len(pwd_ansi)
  1635.         sessionSetup['Parameters']['UnicodePwdLength'] = len(pwd_unicode)
  1636.         sessionSetup['Parameters']['Capabilities'] = SMB.CAP_RAW_MODE
  1637.         sessionSetup['Data']['AnsiPwd'] = pwd_ansi
  1638.         sessionSetup['Data']['UnicodePwd'] = pwd_unicode
  1639.         sessionSetup['Data']['Account'] = str(user)
  1640.         sessionSetup['Data']['PrimaryDomain'] = str(domain)
  1641.         sessionSetup['Data']['NativeOS'] = str(os.name)
  1642.         sessionSetup['Data']['NativeLanMan'] = 'pysmb'
  1643.         smb.addCommand(sessionSetup)
  1644.         self.sendSMB(smb)
  1645.         smb = self.recvSMB()
  1646.         if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
  1647.             self._SMB__uid = smb['Uid']
  1648.             sessionResponse = SMBCommand(smb['Data'][0])
  1649.             sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
  1650.             sessionData = SMBSessionSetupAndXResponse_Data(flags = smb['Flags2'], data = sessionResponse['Data'])
  1651.             self._SMB__server_os = sessionData['NativeOS']
  1652.             self._SMB__server_lanman = sessionData['NativeLanMan']
  1653.             self._SMB__server_domain = sessionData['PrimaryDomain']
  1654.             return 1
  1655.         else:
  1656.             raise Exception('Error: Could not login successfully')
  1657.  
  1658.     
  1659.     def read(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1660.         if not max_size:
  1661.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1662.         
  1663.         smb = NewSMBPacket()
  1664.         smb['Flags1'] = 24
  1665.         smb['Flags2'] = 0
  1666.         smb['Tid'] = tid
  1667.         read = SMBCommand(SMB.SMB_COM_READ)
  1668.         read['Parameters'] = SMBRead_Parameters()
  1669.         read['Parameters']['Fid'] = fid
  1670.         read['Parameters']['Offset'] = offset
  1671.         read['Parameters']['Count'] = max_size
  1672.         smb.addCommand(read)
  1673.         if wait_answer:
  1674.             answer = ''
  1675.             while None:
  1676.                 ans = self.recvSMB()
  1677.                 if ans.isValidAnswer(SMB.SMB_COM_READ):
  1678.                     readResponse = SMBCommand(ans['Data'][0])
  1679.                     readParameters = SMBReadResponse_Parameters(readResponse['Parameters'])
  1680.                     readData = SMBReadResponse_Data(readResponse['Data'])
  1681.                     return readData['Data']
  1682.                     continue
  1683.         
  1684.  
  1685.     
  1686.     def read_andx(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1687.         if not max_size:
  1688.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1689.         
  1690.         smb = NewSMBPacket()
  1691.         smb['Flags1'] = 24
  1692.         smb['Flags2'] = 0
  1693.         smb['Tid'] = tid
  1694.         readAndX = SMBCommand(SMB.SMB_COM_READ_ANDX)
  1695.         readAndX['Parameters'] = SMBReadAndX_Parameters()
  1696.         readAndX['Parameters']['Fid'] = fid
  1697.         readAndX['Parameters']['Offset'] = offset
  1698.         readAndX['Parameters']['MaxCount'] = max_size
  1699.         smb.addCommand(readAndX)
  1700.         if wait_answer:
  1701.             answer = ''
  1702.             while None:
  1703.                 ans = self.recvSMB()
  1704.                 if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
  1705.                     readAndXResponse = SMBCommand(ans['Data'][0])
  1706.                     readAndXParameters = SMBReadAndXResponse_Parameters(readAndXResponse['Parameters'])
  1707.                     offset = readAndXParameters['DataOffset']
  1708.                     count = readAndXParameters['DataCount'] + 65536 * readAndXParameters['DataCount_Hi']
  1709.                     answer += str(ans)[offset:offset + count]
  1710.                     if not ans.isMoreData():
  1711.                         return answer
  1712.                     
  1713.                     max_size = min(max_size, readAndXParameters['Remaining'])
  1714.                     readAndX['Parameters']['Offset'] += count
  1715.                     continue
  1716.         
  1717.  
  1718.     
  1719.     def read_raw(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1720.         if not max_size:
  1721.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1722.         
  1723.         smb = NewSMBPacket()
  1724.         smb['Flags1'] = 24
  1725.         smb['Flags2'] = 0
  1726.         smb['Tid'] = tid
  1727.         readRaw = SMBCommand(SMB.SMB_COM_READ_RAW)
  1728.         readRaw['Parameters'] = SMBReadRaw_Parameters()
  1729.         readRaw['Parameters']['Fid'] = fid
  1730.         readRaw['Parameters']['Offset'] = offset
  1731.         readRaw['Parameters']['MaxCount'] = max_size
  1732.         smb.addCommand(readRaw)
  1733.         self.sendSMB(smb)
  1734.         if wait_answer:
  1735.             data = self._SMB__sess.recv_packet(self._SMB__timeout).get_trailer()
  1736.             if not data:
  1737.                 data = self.read_andx(tid, fid, offset, max_size)
  1738.             
  1739.             return data
  1740.         
  1741.  
  1742.     
  1743.     def write(self, tid, fid, data, offset = 0, wait_answer = 1):
  1744.         smb = NewSMBPacket()
  1745.         smb['Flags1'] = 24
  1746.         smb['Flags2'] = 0
  1747.         smb['Tid'] = tid
  1748.         write = SMBCommand(SMB.SMB_COM_WRITE)
  1749.         smb.addCommand(write)
  1750.         write['Parameters'] = SMBWrite_Parameters()
  1751.         write['Data'] = SMBWrite_Data()
  1752.         write['Parameters']['Fid'] = fid
  1753.         write['Parameters']['Count'] = len(data)
  1754.         write['Parameters']['Offset'] = offset
  1755.         write['Parameters']['Remaining'] = len(data)
  1756.         write['Data']['Data'] = data
  1757.         self.sendSMB(smb)
  1758.         if wait_answer:
  1759.             smb = self.recvSMB()
  1760.             if smb.isValidAnswer(SMB.SMB_COM_WRITE):
  1761.                 return smb
  1762.             
  1763.         
  1764.  
  1765.     
  1766.     def write_andx(self, tid, fid, data, offset = 0, wait_answer = 1):
  1767.         smb = NewSMBPacket()
  1768.         smb['Flags1'] = 24
  1769.         smb['Flags2'] = 0
  1770.         smb['Tid'] = tid
  1771.         writeAndX = SMBCommand(SMB.SMB_COM_WRITE_ANDX)
  1772.         smb.addCommand(writeAndX)
  1773.         writeAndX['Parameters'] = SMBWriteAndX_Parameters()
  1774.         writeAndX['Parameters']['Fid'] = fid
  1775.         writeAndX['Parameters']['Offset'] = offset
  1776.         writeAndX['Parameters']['WriteMode'] = 8
  1777.         writeAndX['Parameters']['Remaining'] = len(data)
  1778.         writeAndX['Parameters']['DataLength'] = len(data)
  1779.         writeAndX['Parameters']['DataOffset'] = len(smb)
  1780.         writeAndX['Data'] = data
  1781.         self.sendSMB(smb)
  1782.         if wait_answer:
  1783.             smb = self.recvSMB()
  1784.             if smb.isValidAnswer(SMB.SMB_COM_WRITE_ANDX):
  1785.                 return smb
  1786.             
  1787.         
  1788.  
  1789.     
  1790.     def write_raw(self, tid, fid, data, offset = 0, wait_answer = 1):
  1791.         smb = NewSMBPacket()
  1792.         smb['Flags1'] = 24
  1793.         smb['Flags2'] = 0
  1794.         smb['Tid'] = tid
  1795.         writeRaw = SMBCommand(SMB.SMB_COM_WRITE_RAW)
  1796.         smb.addCommand(writeRaw)
  1797.         writeRaw['Parameters'] = SMBWriteRaw_Parameters()
  1798.         writeRaw['Parameters']['Fid'] = fid
  1799.         writeRaw['Parameters']['Offset'] = offset
  1800.         writeRaw['Parameters']['Count'] = len(data)
  1801.         writeRaw['Parameters']['DataLength'] = 0
  1802.         writeRaw['Parameters']['DataOffset'] = 0
  1803.         self.sendSMB(smb)
  1804.         self._SMB__sess.send_packet(data)
  1805.         if wait_answer:
  1806.             smb = self.recvSMB()
  1807.             if smb.isValidAnswer(SMB.SMB_COM_WRITE_RAW):
  1808.                 return smb
  1809.             
  1810.         
  1811.  
  1812.     
  1813.     def TransactNamedPipe(self, tid, fid, data = '', noAnswer = 0, waitAnswer = 1, offset = 0):
  1814.         self.send_trans(tid, pack('<HH', 38, fid), '\\PIPE\\\x00', '', data, noAnswer = noAnswer)
  1815.         if noAnswer or not waitAnswer:
  1816.             return None
  1817.         
  1818.         s = self.recv_packet()
  1819.         if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1820.             trans = TRANSHeader(s.get_parameter_words(), s.get_buffer())
  1821.             return trans.get_data()
  1822.         
  1823.  
  1824.     
  1825.     def nt_create_andx(self, tid, filename):
  1826.         smb = NewSMBPacket()
  1827.         smb['Flags1'] = 24
  1828.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1829.         smb['Tid'] = tid
  1830.         ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
  1831.         ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
  1832.         ntCreate['Data'] = SMBNtCreateAndX_Data()
  1833.         ntCreate['Parameters']['FileNameLength'] = len(filename)
  1834.         ntCreate['Parameters']['CreateFlags'] = 22
  1835.         ntCreate['Parameters']['AccessMask'] = 131487
  1836.         ntCreate['Parameters']['CreateOptions'] = 64
  1837.         ntCreate['Data']['FileName'] = filename
  1838.         smb.addCommand(ntCreate)
  1839.         self.sendSMB(smb)
  1840.         while None:
  1841.             smb = self.recvSMB()
  1842.             if smb.isValidAnswer(SMB.SMB_COM_NT_CREATE_ANDX):
  1843.                 ntCreateResponse = SMBCommand(smb['Data'][0])
  1844.                 ntCreateParameters = SMBNtCreateAndXResponse_Parameters(ntCreateResponse['Parameters'])
  1845.                 return ntCreateParameters['Fid']
  1846.                 continue
  1847.  
  1848.     
  1849.     def login_pass_the_hash(self, user, lmhash, nthash, domain = ''):
  1850.         if len(lmhash) % 2:
  1851.             lmhash = '0%s' % lmhash
  1852.         
  1853.         if len(nthash) % 2:
  1854.             nthash = '0%s' % nthash
  1855.         
  1856.         if lmhash:
  1857.             lmhash = self.get_ntlmv1_response(a2b_hex(lmhash))
  1858.         
  1859.         if nthash:
  1860.             nthash = self.get_ntlmv1_response(a2b_hex(nthash))
  1861.         
  1862.         self._login(user, lmhash, nthash, domain)
  1863.  
  1864.     
  1865.     def login_plaintext_password(self, name, password, domain = ''):
  1866.         if password and self._SMB__ntlm_dialect.get_encryption_key():
  1867.             lmhash = ntlm.compute_lmhash(password)
  1868.             nthash = ntlm.compute_nthash(password)
  1869.             lmhash = self.get_ntlmv1_response(lmhash)
  1870.             nthash = self.get_ntlmv1_response(nthash)
  1871.         else:
  1872.             lmhash = password
  1873.             nthash = ''
  1874.         self._login(name, lmhash, nthash, domain)
  1875.  
  1876.     
  1877.     def logoff(self):
  1878.         s = SMBPacket()
  1879.         s.set_command(SMB.SMB_COM_LOGOFF_ANDX)
  1880.         s.set_parameter_words('\xff\x00\x00\x00')
  1881.         self.send_smb(s)
  1882.         s = self.recv_packet()
  1883.  
  1884.     
  1885.     def list_shared(self):
  1886.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\IPC$')
  1887.         buf = StringIO()
  1888.         
  1889.         try:
  1890.             self.send_trans(tid, '', '\\PIPE\\LANMAN\x00', '\x00\x00WrLeh\x00B13BWz\x00\x01\x00\xe0\xff', '')
  1891.             numentries = 0
  1892.             share_list = []
  1893.             while None:
  1894.                 s = self.recv_packet()
  1895.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1896.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1897.                     if not numentries:
  1898.                         (status, data_offset, numentries) = unpack('<HHH', transparam[:6])
  1899.                     
  1900.                     buf.write(transdata)
  1901.                     if not has_more:
  1902.                         share_data = buf.getvalue()
  1903.                         offset = 0
  1904.                         for i in range(0, numentries):
  1905.                             name = share_data[offset:string.find(share_data, '\x00', offset)]
  1906.                             (type, commentoffset) = unpack('<HH', share_data[offset + 14:offset + 18])
  1907.                             comment = share_data[commentoffset - data_offset:share_data.find('\x00', commentoffset - data_offset)]
  1908.                             offset = offset + 20
  1909.                             share_list.append(SharedDevice(name, type, comment))
  1910.                         
  1911.                         return share_list
  1912.                     
  1913.         finally:
  1914.             buf.close()
  1915.             self.disconnect_tree(tid)
  1916.  
  1917.  
  1918.     
  1919.     def list_path(self, service, path = '*', password = None):
  1920.         path = string.replace(path, '/', '\\')
  1921.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1922.         
  1923.         try:
  1924.             self.trans2(tid, '\x01\x00', '\x00', '\x16\x00\x00\x02\x06\x00\x04\x01\x00\x00\x00\x00' + path + '\x00', '')
  1925.             while None:
  1926.                 s = self.recv_packet()
  1927.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION2):
  1928.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1929.                     (sid, searchcnt, eos, erroffset, lastnameoffset) = unpack('<HHHHH', transparam)
  1930.                     files = []
  1931.                     offset = 0
  1932.                     data_len = len(transdata)
  1933.                     while offset < data_len:
  1934.                         (nextentry, fileindex, lowct, highct, lowat, highat, lowmt, highmt, lowcht, hightcht, loweof, higheof, lowsz, highsz, attrib, longnamelen, easz, shortnamelen) = unpack('<lL12LLlLB', transdata[offset:offset + 69])
  1935.                         files.append(SharedFile(highct << 32 | lowct, highat << 32 | lowat, highmt << 32 | lowmt, higheof << 32 | loweof, highsz << 32 | lowsz, attrib, transdata[offset + 70:offset + 70 + shortnamelen], transdata[offset + 94:offset + 94 + longnamelen]))
  1936.                         offset = offset + nextentry
  1937.                         if not nextentry:
  1938.                             break
  1939.                             continue
  1940.                     return files
  1941.                     continue
  1942.         finally:
  1943.             self.disconnect_tree(tid)
  1944.  
  1945.  
  1946.     
  1947.     def retr_file(self, service, filename, callback, mode = SMB_O_OPEN, offset = 0, password = None):
  1948.         filename = string.replace(filename, '/', '\\')
  1949.         fid = -1
  1950.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1951.         
  1952.         try:
  1953.             (fid, attrib, lastwritetime, datasize, grantedaccess, filetype, devicestate, action, serverfid) = self.open_andx(tid, filename, mode, SMB_ACCESS_READ | SMB_SHARE_DENY_WRITE)
  1954.             if not datasize:
  1955.                 datasize = self.query_file_info(tid, fid)
  1956.             
  1957.             if self._SMB__ntlm_dialect.is_rawmode():
  1958.                 self._SMB__raw_retr_file(tid, fid, offset, datasize, callback)
  1959.             else:
  1960.                 self._SMB__nonraw_retr_file(tid, fid, offset, datasize, callback)
  1961.         finally:
  1962.             if fid >= 0:
  1963.                 self.close(tid, fid)
  1964.             
  1965.             self.disconnect_tree(tid)
  1966.  
  1967.  
  1968.     
  1969.     def stor_file(self, service, filename, callback, mode = SMB_O_CREAT | SMB_O_TRUNC, offset = 0, password = None):
  1970.         filename = string.replace(filename, '/', '\\')
  1971.         fid = -1
  1972.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1973.         
  1974.         try:
  1975.             (fid, attrib, lastwritetime, datasize, grantedaccess, filetype, devicestate, action, serverfid) = self.open_andx(tid, filename, mode, SMB_ACCESS_WRITE | SMB_SHARE_DENY_WRITE)
  1976.             if self._SMB__ntlm_dialect.get_max_buffer() < 16384 and self._SMB__ntlm_dialect.is_rawmode():
  1977.                 self._SMB__raw_stor_file(tid, fid, offset, datasize, callback)
  1978.                 fid = -1
  1979.             else:
  1980.                 self._SMB__nonraw_stor_file(tid, fid, offset, datasize, callback)
  1981.         finally:
  1982.             if fid >= 0:
  1983.                 self.close(tid, fid)
  1984.             
  1985.             self.disconnect_tree(tid)
  1986.  
  1987.  
  1988.     
  1989.     def copy(self, src_service, src_path, dest_service, dest_path, callback = None, write_mode = SMB_O_CREAT | SMB_O_TRUNC, src_password = None, dest_password = None):
  1990.         dest_path = string.replace(dest_path, '/', '\\')
  1991.         src_path = string.replace(src_path, '/', '\\')
  1992.         src_tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + src_service, src_password)
  1993.         dest_tid = -1
  1994.         
  1995.         try:
  1996.             if src_service == dest_service:
  1997.                 dest_tid = src_tid
  1998.             else:
  1999.                 dest_tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + dest_service, dest_password)
  2000.             dest_fid = self.open_andx(dest_tid, dest_path, write_mode, SMB_ACCESS_WRITE | SMB_SHARE_DENY_WRITE)[0]
  2001.             (src_fid, _, _, src_datasize, _, _, _, _, _) = self.open_andx(src_tid, src_path, SMB_O_OPEN, SMB_ACCESS_READ | SMB_SHARE_DENY_WRITE)
  2002.             if callback:
  2003.                 callback(0, src_datasize)
  2004.             
  2005.             max_buf_size = (self._SMB__ntlm_dialect.get_max_buffer() >> 10) << 10
  2006.             read_offset = 0
  2007.             write_offset = 0
  2008.             while read_offset < src_datasize:
  2009.                 self._SMB__send_smb_packet(SMB.SMB_COM_READ_ANDX, 0, 0, src_tid, 0, pack('<BBHHLHHLH', 255, 0, 0, src_fid, read_offset, max_buf_size, max_buf_size, 0, 0), '')
  2010.                 while None:
  2011.                     s = self.recv_packet()
  2012.                     if self.isValidAnswer(s, SMB.SMB_COM_READ_ANDX):
  2013.                         offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  2014.                         (data_len, dataoffset) = unpack('<HH', s.get_parameter_words()[10 + offset:14 + offset])
  2015.                         if data_len == len(d):
  2016.                             self._SMB__send_smb_packet(SMB.SMB_COM_WRITE_ANDX, 0, 0, dest_tid, 0, pack('<BBHHLLHHHHH', 255, 0, 0, dest_fid, write_offset, 0, 0, 0, 0, data_len, 59), d)
  2017.                         else:
  2018.                             self._SMB__send_smb_packet(SMB.SMB_COM_WRITE_ANDX, 0, 0, dest_tid, 0, pack('<BBHHLLHHHHH', 255, 0, 0, dest_fid, write_offset, 0, 0, 0, 0, data_len, 59), d[dataoffset - 59:(dataoffset - 59) + data_len])
  2019.                         while None:
  2020.                             s = self.recv_packet()
  2021.                             if self.isValidAnswer(s, SMB.SMB_COM_WRITE_ANDX):
  2022.                                 offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  2023.                                 write_offset = write_offset + unpack('<H', s.get_parameter_words()[4 + offset:6 + offset])[0]
  2024.                                 break
  2025.                                 continue
  2026.                         read_offset = read_offset + data_len
  2027.                         if callback:
  2028.                             callback(read_offset, src_datasize)
  2029.                         
  2030.                         break
  2031.                         continue
  2032.         finally:
  2033.             self.disconnect_tree(src_tid)
  2034.             if dest_tid > -1 and src_service != dest_service:
  2035.                 self.disconnect_tree(dest_tid)
  2036.             
  2037.  
  2038.  
  2039.     
  2040.     def check_dir(self, service, path, password = None):
  2041.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2042.         
  2043.         try:
  2044.             self._SMB__send_smb_packet(SMB.SMB_COM_CHECK_DIRECTORY, 8, 0, tid, 0, '', '\x04' + path + '\x00')
  2045.             while None:
  2046.                 s = self.recv_packet()
  2047.                 if self.isValidAnswer(s, SMB.SMB_COM_CHECK_DIRECTORY):
  2048.                     return None
  2049.                     continue
  2050.         finally:
  2051.             self.disconnect_tree(s.get_tid())
  2052.  
  2053.  
  2054.     
  2055.     def remove(self, service, path, password = None):
  2056.         self.list_path(service, path, password)
  2057.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2058.         
  2059.         try:
  2060.             self._SMB__send_smb_packet(SMB.SMB_COM_DELETE, 8, 0, tid, 0, pack('<H', ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE), '\x04' + path + '\x00')
  2061.             while None:
  2062.                 s = self.recv_packet()
  2063.                 if self.isValidAnswer(s, SMB.SMB_COM_DELETE):
  2064.                     return None
  2065.                     continue
  2066.         finally:
  2067.             self.disconnect_tree(s.get_tid())
  2068.  
  2069.  
  2070.     
  2071.     def rmdir(self, service, path, password = None):
  2072.         self.check_dir(service, path, password)
  2073.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2074.         
  2075.         try:
  2076.             self._SMB__send_smb_packet(SMB.SMB_COM_DELETE_DIRECTORY, 8, 0, tid, 0, '', '\x04' + path + '\x00')
  2077.             while None:
  2078.                 s = self.recv_packet()
  2079.                 if self.isValidAnswer(s, SMB.SMB_COM_DELETE_DIRECTORY):
  2080.                     return None
  2081.                     continue
  2082.         finally:
  2083.             self.disconnect_tree(s.get_tid())
  2084.  
  2085.  
  2086.     
  2087.     def mkdir(self, service, path, password = None):
  2088.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2089.         
  2090.         try:
  2091.             s = SMBPacket()
  2092.             s.set_command(SMB.SMB_COM_CREATE_DIRECTORY)
  2093.             s.set_flags(8)
  2094.             s.set_flags2(0)
  2095.             s.set_tid(tid)
  2096.             s.set_parameter_words('')
  2097.             s.set_buffer('\x04' + path + '\x00')
  2098.             self.send_smb(s)
  2099.             s = self.recv_packet()
  2100.             if self.isValidAnswer(s, SMB.SMB_COM_CREATE_DIRECTORY):
  2101.                 return 1
  2102.             
  2103.             return 0
  2104.         finally:
  2105.             self.disconnect_tree(s.get_tid())
  2106.  
  2107.  
  2108.     
  2109.     def rename(self, service, old_path, new_path, password = None):
  2110.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2111.         
  2112.         try:
  2113.             s = SMBPacket()
  2114.             s.set_command(SMB.SMB_COM_RENAME)
  2115.             s.set_flags(8)
  2116.             s.set_flags2(0)
  2117.             s.set_tid(tid)
  2118.             s.set_parameter_words(pack('<H', ATTR_SYSTEM | ATTR_HIDDEN | ATTR_DIRECTORY))
  2119.             s.set_buffer('\x04' + old_path + '\x00\x04' + new_path + '\x00')
  2120.             self.send_smb(s)
  2121.             s = self.recv_packet()
  2122.             if self.isValidAnswer(s, SMB.SMB_COM_RENAME):
  2123.                 return 1
  2124.             
  2125.             return 0
  2126.         finally:
  2127.             self.disconnect_tree(s.get_tid())
  2128.  
  2129.  
  2130.     
  2131.     def browse_domains(self):
  2132.         return self._SMB__browse_servers(SV_TYPE_DOMAIN_ENUM, SMBDomain, '')
  2133.  
  2134.     
  2135.     def browse_servers_for_domain(self, domain = None):
  2136.         if not domain:
  2137.             domain = self._SMB__server_domain
  2138.         
  2139.         return self._SMB__browse_servers(SV_TYPE_SERVER | SV_TYPE_PRINTQ_SERVER | SV_TYPE_WFW | SV_TYPE_NT, SMBMachine, domain)
  2140.  
  2141.     
  2142.     def get_socket(self):
  2143.         return self._SMB__sess.get_socket()
  2144.  
  2145.  
  2146. ERRDOS = {
  2147.     1: 'Invalid function',
  2148.     2: 'File not found',
  2149.     3: 'Invalid directory',
  2150.     4: 'Too many open files',
  2151.     5: 'Access denied',
  2152.     6: 'Invalid file handle. Please file a bug report.',
  2153.     7: 'Memory control blocks destroyed',
  2154.     8: 'Out of memory',
  2155.     9: 'Invalid memory block address',
  2156.     10: 'Invalid environment',
  2157.     11: 'Invalid format',
  2158.     12: 'Invalid open mode',
  2159.     13: 'Invalid data',
  2160.     15: 'Invalid drive',
  2161.     16: "Attempt to remove server's current directory",
  2162.     17: 'Not the same device',
  2163.     18: 'No files found',
  2164.     32: 'Sharing mode conflicts detected',
  2165.     33: 'Lock request conflicts detected',
  2166.     80: 'File already exists' }
  2167. ERRSRV = {
  2168.     1: 'Non-specific error',
  2169.     2: 'Bad password',
  2170.     4: 'Access denied',
  2171.     5: 'Invalid tid. Please file a bug report.',
  2172.     6: 'Invalid network name',
  2173.     7: 'Invalid device',
  2174.     49: 'Print queue full',
  2175.     50: 'Print queue full',
  2176.     51: 'EOF on print queue dump',
  2177.     52: 'Invalid print file handle',
  2178.     64: 'Command not recognized. Please file a bug report.',
  2179.     65: 'Internal server error',
  2180.     67: 'Invalid path',
  2181.     69: 'Invalid access permissions',
  2182.     71: 'Invalid attribute mode',
  2183.     81: 'Server is paused',
  2184.     82: 'Not receiving messages',
  2185.     83: 'No room to buffer messages',
  2186.     87: 'Too many remote user names',
  2187.     88: 'Operation timeout',
  2188.     89: 'Out of resources',
  2189.     91: 'Invalid user handle. Please file a bug report.',
  2190.     250: 'Temporarily unable to support raw mode for transfer',
  2191.     251: 'Temporarily unable to support raw mode for transfer',
  2192.     252: 'Continue in MPX mode',
  2193.     65535: 'Unsupported function' }
  2194. ERRHRD = {
  2195.     19: 'Media is write-protected',
  2196.     20: 'Unknown unit',
  2197.     21: 'Drive not ready',
  2198.     22: 'Unknown command',
  2199.     23: 'CRC error',
  2200.     24: 'Bad request',
  2201.     25: 'Seek error',
  2202.     26: 'Unknown media type',
  2203.     27: 'Sector not found',
  2204.     28: 'Printer out of paper',
  2205.     29: 'Write fault',
  2206.     30: 'Read fault',
  2207.     31: 'General failure',
  2208.     32: 'Open conflicts with an existing open',
  2209.     33: 'Invalid lock request',
  2210.     34: 'Wrong disk in drive',
  2211.     35: 'FCBs not available',
  2212.     36: 'Sharing buffer exceeded' }
  2213.